在iOS上预加载资产

在iOS上预加载资产

问题描述:

假设我们想要在UIImageView中使用一系列PNG来实现多个动画。 如果我们在动画中有很多图片,我们会从发送消息[myImgView startAnimation]的那一刻起延迟,这是因为所有图像都加载到内存中。 我注意到加载是懒惰的:只要startAnimation消息没有发送图像就不会加载到内存中。 为了避免延迟问题,我加载了应用程序委托中的所有动画,附加为子视图,并设置了一次动画。我想了解什么是最佳解决方案?如果我的实际解决方案有一个draback?在iOS上预加载资产

对于懒加载你是对的。我从来没有能够确定它实际上是懒惰的从磁盘还是懒惰的解压缩,但无论在哪种情况下,UIImage(和下面的CGImage)都未必完全处理并准备绘制,直到实际使用。我认为它可能会在未来再次变得没有准备好,这取决于苹果公司内部如何处理内存警告。

如果你想成为一个真正热衷的人,我想最好的解决方案是使用CoreGraphics在后台加载和解压缩图像,只有在加载尚未完成时暂停才能在startAnimation完成加载。你不能直接用UIKit对象来实现它,因为它们不能在主线程中的任何地方被调用。您需要获取CGImage,绘制到位图上下文,然后从位图上下文创建一个图像,并将其发布到主线程以包装到UIImage中。而使用NSOperationQueue来整理完整的操作列表可能会很聪明。

假设你不介意在加载所有PNG时额外的阻塞启动成本,并且正在处理内存警告,那么当前的方法应该没有任何问题,我不能想到更好的解决方案,同时保持高水平的Objective-C的东西。

+0

问题的一部分也是由于算法本身的复杂性,PNG解压缩(相对来说)非常慢。加载JPEG图像通常更快,但显然不总是理想的。只要可以预加载图像数据,就可以避免即时解压缩的命中。 – 2010-12-12 22:11:08

+0

这提出了另一种解决方案:用绝对最小限度的解压缩对PNG进行编码,对于每个扫描行和每个放大块存储为原始/文字段,我想这将是过滤器0(无预测)。虽然我没有意识到任何软件可以让你调整输出到这个范围,但我知道Xcode对PNG做了一些额外的处理,所以你可能不得不用自己的方式让你的基本上无压缩的PNG正确地复制到束。 – Tommy 2010-12-12 22:45:37