7

在新发布的 iOS 5.0 SDK 上简单地重新编译我们的 iPhone 应用程序后,我遇到了奇怪的问题 - 所有 UIImage:imageNamed (第一次调用实际图像加载)和 UIImage:imageWithContentsOfFile 开始工作比以前慢 10 倍。我设法缩小问题范围:这仅适用于 jpeg 和 png 文件(不是 gifs!),这不是因为文件大小。即使是直接加载小型 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 内部发生了巨大的变化:(

4

2 回答 2

8

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

因此,我使用 Instrument 的 Time Profiler 并深入研究了我的应用程序,结果发现每次应用程序挂起时,它实际上都是在为 UIImageViews 打开 PNG 文件的过程中,就像你也发现的那样。但我写的其他应用程序没有这个问题,我做的一切都是一样的。因此,根据您的体验以及我的其他应用程序运行良好,我认为这一定与 PNG 文件本身有关。你猜怎么着,结果证明我是对的。

因此,我坐下来编写了一个脚本,通过 ImageMagick 的转换将所有 PNG 文件通过管道传输以生成 TGA,然后删除 PNG(只是为了更好地衡量),然后将临时 TGA 转换回 PNG 文件。这样,我确保它们不仅不再由 Photoshop 创建,而且完全重写。

那成功了。现在一切都运行顺利,就像在 iOS 3 和 4 上一样。

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

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

我希望这有帮助!

于 2011-11-03T21:10:31.217 回答
4

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

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

于 2011-10-31T15:57:08.537 回答