【问题标题】:Preloading assets on iOS在 iOS 上预加载资源
【发布时间】:2010-12-12 20:42:00
【问题描述】:

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

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    关于延迟加载,您是对的。我一直无法确定它实际上是从磁盘进行延迟假脱机还是延迟解压缩,但在任何一种情况下,UIImage(以及下面的 CGImage)不一定完全处理并准备好绘制,直到它实际使用。我认为它可能会在未来再次变得未就绪,具体取决于 Apple 在内部如何处理内存警告。

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

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

    【讨论】:

    • 部分问题是由于算法本身的复杂性,PNG 解压缩(相对而言)非常慢。 JPEG 图像通常加载速度更快,但显然并不总是理想的。只要能够预加载图片数据,就可以避免动态解压带来的打击。
    • 这提出了一种替代解决方案:使用绝对最小解压缩对 PNG 进行编码,我猜这将是每个扫描线的过滤器 0(无预测)和存储为原始/文字部分的每个放气块。虽然我不知道有任何软件可以让你在那个程度上调整输出,而且我知道 Xcode 对 PNG 做了一些额外的处理,所以你可能不得不竭尽全力让你的基本未压缩的 PNG 正确复制到捆绑。
    猜你喜欢
    • 2012-03-16
    • 2016-03-11
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多