UIImage:imageWithContentsOfFile在iOS 5.0中比之前慢10倍。

7

在新发布的iOS 5.0 SDK上重新编译我们的iPhone应用程序后,我遇到了奇怪的问题——所有的UIImage:imageNamed(第一次调用实际图像加载)和UIImage:imageWithContentsOfFile比以前慢10倍。我设法将问题缩小:这仅适用于jpeg和png文件(不是gif!),而且这不是因为文件大小。即使是直接加载32*32的小png也需要大约300毫秒……与旧设备上的30毫秒相比(使用完全相同的代码在3.1和4.3.5上进行了检查)。

我还尝试使用新引入的CIImage通过以下代码加载图像

WLLog(@"Data loading...");
NSData *imageData = [NSData dataWithContentsOfFile:path];
WLLog(@"CIImage creation...");
CIImage* cii = [CIImage imageWithData:imageData];
WLLog(@"CIImage creation ok...");
float scle = 1.0;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    scle = [[UIScreen mainScreen] scale];
}
#endif
CIContext *context = [CIContext contextWithOptions:nil];
UIImage* res5 = [[UIImage alloc] init];
WLLog(@"UIImage creation...");
[res5 initWithCGImage:[context createCGImage:cii fromRect:cii.extent] scale:scle orientation:UIImageOrientationUp];
WLLog(@"Done!");

一直没有成功……这一行代码

CIImage* cii = [CIImage imageWithData:imageData];

即使是小图片(4Kb png),也需要相同的300毫秒。在我看来,根本没有什么可解析的!

有没有什么方法可以解决这种奇怪的加载时间变化?目前看起来sdk内部发生了巨大的变化:(

2个回答

8
我曾遇到相同的问题,花了几个小时才找出了问题所在。 我们的两种情况似乎完全一样:一个旧项目,在iOS5上无法正常运行。
所以我使用Instrument的Time Profiler深入挖掘我的应用程序,只发现每次应用程序挂起时,它实际上正在打开PNG文件用于UIImageView,就像你也发现的那样。 但是其他应用程序没有这个问题,我做了所有相同的事情。因此,根据您的经验和我的其他应用程序运行良好,我认为它必须与PNG文件本身有关。结果证明,我是正确的。
因此,我坐下来编写了一个脚本,通过ImageMagick的convert将所有PNG文件转换为TGAs,然后删除PNG文件(只是为了保险),然后将临时TGAs转换回PNG文件。这样,我确保它们不仅不再由Photoshop创建,而且完全被重写。
这样做就成功了。 现在一切都很顺利,就像在iOS 3和4上一样。
我不确定它与Photoshop有关。 我最近制作的其他应用程序使用Photoshop制作的PNG文件运行良好。 所以可能是我一年前使用的Photoshop版本首先创建这些PNG文件。
或者可能仅仅覆盖旧的图像文件就足够了,我不确定。 但现在它运行得很好。
希望这有所帮助!

谢谢,我一定会尝试并在此发表是否有所帮助。无论如何,对我来说似乎是个bug(新发布的5.0.1版本也没有改善),我很快会向Apple报告。 - IPv6
那么,你试过了吗?它对你也起作用了吗?- 我进行了更多的测试,证实这与从磁盘读取PNG有关。实际上,根据我进行的另一个时间分析器跟踪,iOS5在为读取的PNG创建元数据类时丢失了最大的时间块。 - Martin
太棒了!是的,这非常有帮助,谢谢!你说得对 - 看起来元数据是导致这种疯狂的原因(无论是对于jpeg还是png)。在禁用所有png和jpeg元数据后重新保存,一切都开始像往常一样工作 - 图像加载只需30毫秒。似乎5.0之前的iOS SDK完全忽略了任何png / jpeg元数据。 - IPv6
2
这是单个Photoshop“保存为Web选项”的截图,它负责这个问题(应该没有问题)。我发现在MacOS版本的Photoshop中默认打开此选项,在Windows版本的Photoshop中则默认关闭此选项,因此值得注意。 https://lh6.googleusercontent.com/-R_VCI3ky9yQ/Trenrxsl-uI/AAAAAAAAFU4/pd66ZTLHKlQ/s778/Scr20111107_1257_%25231.jpg - IPv6

4

这可能是一个bug。通过错误报告器向苹果提交一个雷达。一定要准备一个简单的项目,清楚地展示这个bug并将其附加到错误报告中--否则苹果会给你发送一封电子邮件要求提供一个。

在此发布您的雷达号码,以便其他遇到类似问题的人在向苹果提交类似的bug时可以参考该号码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接