2011-10-31 118 views
7

在新发布的iOS 5.0 SDK中简单地重新编译我们的iPhone应用程序后,我遇到了奇怪的问题 - 所有UIImage:imageNamed(首次调用带有实际图像加载)和UIImage:imageWithContentsOfFile开始工作10比以前慢了很多倍。我设法缩小了问题:只有jpeg和png文件(不是gifs!)才是这种情况,这不是因为文件大小。甚至直接加载小32 * 32 PNG大约需要300毫秒......相比之下,旧设备上的30毫秒(使用完全相同的代码在3.1和4.3.5上进行检查)UIImage:imageWithContentsOfFile在iOS 5.0中慢了10倍

我还尝试通过新引入的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内部有些变化很大:(

回答

8

。我遇到了同样的问题,花了几个小时才发现问题出在哪里,我们的两种情况看起来是完全一样的:一个旧的项目在iOS5上运行得并不顺利, Ÿ更多。

所以我拿了Instrument的时间分析器,挖到我的应用程序的深度,只是为了找出每次应用程序挂起时它实际上是在为UIImageViews打开PNG文件的过程中,就像你发现的一样。 但是我写的其他应用程序没有这个问题,并且我以同样的方式做了所有事情。因此,根据您的经验和我的其他应用运行良好来判断,我认为它必须与PNG文件本身有关。并猜测是什么,结果证明我是对的。

因此,我坐下来写了一个脚本,通过ImageMagick的convert将所有PNG文件传送出去,然后删除PNG(只是为了好的措施),然后将临时TGA转换回PNG文件。这样我就确信它们不仅不是由Photoshop创建的,而且也完全重写了。

这样做。现在一切顺利,就像它在iOS 3和4上一样。

我不确定它是否与Photoshop有关。其他应用程序,我最近用Photoshop制作的PNG工作得很好。所以也许这是一年前我几乎用来创建这些PNG的Photoshop版本。或者只是覆盖旧的图像文件就够了,我不确定。但现在它运行得很好。

我希望这有助于!

+0

谢谢,我一定会试一试,并在这里发帖,如果有帮助。无论如何,似乎是一个错误对我来说(事情不是最好的新发布的5.0.1),我会立即将它提交给苹果 – IPv6

+0

所以,你试过了吗?它也与你一起工作吗? - 我做了更多的测试,证实它与从磁盘读取PNG有关。实际上,通过另一个Time Profiler跟踪来判断,我创建了读取的PNG的元数据类时,iOS5已经失去了最大的时间。 – Martin

+0

太棒了!是的,这有助于很多,谢谢!并且你是对的 - 似乎元数据负责这个crazines(包括jpeg和png)。在没有启用元数据的情况下重新保存所有png和jpeg后,所有图片开始像往常一样工作 - 图像以30ms加载。似乎像5.0之前版本的ios SDKs忽略了任何png/jpeg元数据 – IPv6

4

这很可能是一个bug。通过bug reporter向苹果提交雷达。一定要把一个简单的项目放在一起,清楚地显示bug并附上它臭虫报告 - 否则苹果将在这里向您发送电子邮件,要求一个

发表你的雷达#,以便其他人有类似的问题提交了类似的错误时,苹果也可以引用#