2014-12-02 78 views
2

我知道我可以用[UIImage imageNamed:]或其他UIImage方法创建UIImages。我使用Image I/O在我的应用程序中创建gif动画。并且调整图像的大小,因为它速度超快![iOS]使用CFDataRef创建图像源时,Image I/O缓存解码图像吗?

在WWDC 2012会议:iOS App Performance: Graphics and Animations,Apple工程师建议我不应该自己缓存图像,因为图像缓存是由系统处理的。从苹果公司的Image I/O Programming Guide的特征的图像I/O提供一个

有效的缓存

所以我决定让图像I/O缓存中的所有图片我。有一个在 Image Source Option Dictionary Keys命名为kCGImageSourceShouldCache键其中描述说

图像是否应该被解码的形式进行缓存。

我相信如果我使用url创建图像源,那么以后创建的图像将被缓存。但是如果图像源是用CFDataRef对象创建的呢?它只是指向某些图像数据的指针,它不像可以识别独特资源的url。在这种情况下Image I/O是否仍然缓存图像?谢谢。

这里是我用来创建图像的代码:

CFDictionaryRef myOptions = NULL; 
CFStringRef  myKeys[2]; 
CFTypeRef   myValues[2]; 

myKeys[0] = kCGImageSourceShouldCache; 
myValues[0] = (CFTypeRef)kCFBooleanTrue; 
myKeys[1] = kCGImageSourceShouldAllowFloat; 
myValues[1] = (CFTypeRef)kCFBooleanTrue; 

myOptions = CFDictionaryCreate(NULL, (const void **) myKeys, 
           (const void **) myValues, 2, 
           &kCFTypeDictionaryKeyCallBacks, 
           & kCFTypeDictionaryValueCallBacks); 

CGImageSourceRef imageSource = CGImageSourceCreateWithData(imageData, myOptions); 
CFRelease(myOptions); 
CGImageRef myImage = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); 
CFRelease(imageSource); 

回答

0

一些实验仪器用后,我终于想通了这一点。也就是说,如果打开缓存选项,图像解码只会发生一次,并且在第一次需要绘制图像时发生。只要我保留图像的参考,图像的解码版本就会被缓存。图像的来源不相关。

+0

是的,有些人实际上发现解码速度很慢,甚至会在后台线程中将图像渲染到离屏1x1上下文以强制解码。 – Andy 2014-12-03 02:14:54