gpt4 book ai didi

ios - 在后台线程中读取 CGImageRef 会使应用程序崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:13:52 25 4
gpt4 key购买 nike

我有一个很大的 jpeg 图像,我想在我的 opengl 引擎中异步加载它。如果在主线程上完成,一切都很好,但速度很慢。

当我尝试将图 block 加载到 NSOperationBlock 上时,它总是在尝试访问我之前在主线程上加载的共享图像数据指针时崩溃。

一定有一些我无法通过后台操作获得的东西,因为我假设我可以访问我在主线程上创建的内存部分。

我尝试做的是以下内容:

@interface MyViewer
{
}
@property (atomic, assign) CGImageRef imageRef;
@property (atomic, assign) CGDataProviderRef dataProvider;
@property (atomic, assign) int loadedTextures;
@end

...

- (void) loadAllTiles:(NSData*) imgData
{
queue = [[NSOperationQueue alloc] init];
//Loop for Total Number of Textures

self.dataProvider = CGDataProviderCreateWithData(NULL,[imgData bytes],[imgData length],0);
self.imageRef = CGImageCreateWithJPEGDataProvider(self.dataProvider, NULL, NO, kCGRenderingIntentDefault);

for (int i=0; i<tileCount; i++)
{

// I also tried this but without luck
//CGImageRetain(self.imageRef);
//CGDataProviderRetain(self.dataProvider);

NSBlockOperation *partsLoading = [[NSBlockOperation alloc] init];
__weak NSBlockOperation *weakpartsLoadingOp = partsLoading;
[partsLoading addExecutionBlock: ^ {

TamTexture2D& pTex2D = viewer->getTile(i);

CGImageRef subImgRef = CGImageCreateWithImageInRect(self.imageRef, CGRectMake(pTex2D.left, pTex2D.top, pTex2D.width, pTex2D.height));

//!!!Its crashing here!!!
CFDataRef cgSubImgDataRef = CGDataProviderCopyData(CGImageGetDataProvider(subImgRef));
CGImageRelease(subImgRef);

...
}];

//Adding Parts loading on low priority thread. Is it all right ????
[partsLoading setThreadPriority:0.0];
[queue addOperation:partsLoading];

}

最佳答案

我终于找到我的问题了...

我已经阅读了 Quartz2D 文档,看来我们不应该再使用 CGDataProviderCreateWithData 和 CGI​​mageCreateWithJPEGDataProvider。我想那里的用法不是线程安全的。

按照文档的建议,我现在像这样使用 CGImageSource API:

self.imageSrcRef = CGImageSourceCreateWithData((__bridge CFDataRef)imgData, NULL);

// get imagePropertiesDictionary
CFDictionaryRef imagePropertiesDictionary = CGImageSourceCopyPropertiesAtIndex(m_imageSrcRef,0, NULL);

self.imageRef = CGImageSourceCreateImageAtIndex(m_imageSrcRef, 0, imagePropertiesDictionary);

关于ios - 在后台线程中读取 CGImageRef 会使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16672506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com