UIImage:imageWithContentsOfFile在iOS 5.0中慢10倍

时间:2011-10-31 15:22:10

标签: iphone uiimage ios5 imagenamed

在新发布的iOS 5.0 SDK上重新编译我们的iPhone应用程序后,我遇到了一个奇怪的问题 - 所有UIImage:imageNamed(第一次调用实际图像加载)和UIImage:imageWithContentsOfFile开始工作比之前慢10倍。我设法缩小问题:这只是jpeg和png文件(不是GIF!)的情况,这不是因为文件大小。即使直接加载小型32 * 32 png也需要300ms左右...相比之下,旧设备需要30ms(在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毫秒。 imho,根本没有什么可以解析的!

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

2 个答案:

答案 0 :(得分:8)

我遇到了同样的问题,我花了几个小时才发现出了什么问题。我们的两种情况似乎完全相同:一个在iOS5上运行得不好的旧项目。

所以我使用了仪器的Time Profiler并挖掘了我的应用程序的深度,但发现每次应用程序挂起它实际上都是在为UIImageViews打开PNG文件的过程中,就像你发现的那样。 但是我写的其他应用程序没有这个问题,我以同样的方式做了一切。因此,根据您的经验以及我的其他应用程序运行良好来判断,我认为它必须与PNG文件本身有关。猜猜是什么,结果证明我是对的。

所以我坐下来编写了一个脚本,通过ImageMagick的转换来管理所有PNG文件以从中创建TGAs,然后删除PNG(仅用于测量),然后将临时TGA转换回PNG文件。这样我确保它们不仅不再由Photoshop创建,而且还完全重写。

这就是诀窍。现在一切都顺利进行,就像在iOS 3和4上一样。

我不确定它是否与Photoshop有关。我最近使用Photoshop制作的PNG可以正常使用其他应用程序。所以也许是我在一年前使用的Photoshop版本首先创建了这些PNG。

或者只是简单地覆盖旧的图像文件就足够了,我不确定。但现在运行得很好。

我希望这有帮助!

答案 1 :(得分:4)

这很可能是一个错误。通过bug reporter向Apple提交雷达。请务必将一个简单的项目放在一起,该项目清楚地演示了错误并将其附加到错误报告中 - 否则Apple会向您发送一封要求提供错误的电子邮件。

在这里发布您的雷达#所以其他有类似问题的人也可以在向Apple提交类似的错误时参考#。