【问题标题】:[iOS]Does Image I/O cache decoded image when creating image source with CFDataRef?[iOS]使用 CFDataRef 创建图像源时,Image I/O 是否缓存解码后的图像?
【发布时间】:2015-01-31 00:42:59
【问题描述】:

我知道我可以使用 [UIImage imageNamed:] 或其他 UIImage 方法创建 UIImages。我使用 Image I/O 在我的应用程序中创建 gif 动画。并调整图像大小,因为它超级快!

在 WWDC 2012 会议:iOS App Performance: Graphics and Animations 中,Apple 工程师建议我不应该自己缓存图像,因为图像缓存是由系统处理的。从 Apple 的 Image I/O Programming Guide 来看,Image I/O 提供的功能之一是

有效的缓存

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

图像是否应该以解码的形式缓存。

我相信如果我创建一个带有 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);

【问题讨论】:

    标签: ios objective-c image caching


    【解决方案1】:

    在对 Instruments 进行了一些实验后,我终于明白了这一点。也就是说,如果开启缓存选项,图像解码只会发生一次,并且在第一次需要绘制图像时发生。只要我保留图像的引用,图像的解码版本就会被缓存。图片来源无关。

    【讨论】:

    • 是的,有些人实际上发现解码速度很慢,甚至会在后台线程上将图像渲染到屏幕外 1x1 上下文以强制解码。
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 2016-11-30
    • 2012-01-06
    • 2012-01-28
    • 2012-01-14
    • 2019-03-07
    • 2013-06-02
    相关资源
    最近更新 更多