在我的iOS应用程序中,我有UICollectionView
,它显示大约1200个小(35x35点)图像。这些图像存储在应用程序包中。如何提高包含大量小图片的UCollectionView的性能?
我正确地重用UICollectionViewCell
秒,但仍然有取决于我如何处理图像加载性能问题:
我的应用程序是应用程序扩展和那些具有有限内存(40 MB在这种情况下)。将所有1200张图片放入资产目录并使用
UIImage(named: "imageName")
加载它们导致内存崩溃 - 系统缓存的图像填满了内存。在某些时候,应用程序需要分配更大的内存部分,但由于缓存的图像,这些部分不可用。操作系统不是触发内存警告和清理缓存,而是杀死了应用程序。我改变了避免图像缓存的方法。我把图像放到我的项目中(不是作为目录),我现在用
NSBundle.mainBundle().pathForResource("imageName", ofType: "png")
加载它们。该应用程序不再因内存错误而崩溃,但单个图像的加载需要更长的时间,即使在最新的iPhone上,快速滚动也是滞后的。
我在图像上完全控制研究,并可以将它们例如以.JPEG或优化他们(我已经尝试过ImageOptim并没有成功一些其他的选择)。
我该如何解决这两个性能问题?
编辑1:
我也试过在后台线程加载图像。这是从我的UICollectionViewCell
子类代码:
private func loadImageNamed(name: String) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { [weak self]() in
let image = bundle.pathForResource(name, ofType: "png")?.CGImage
if name == self?.displayedImageName {
dispatch_async(dispatch_get_main_queue(), {
if name == self?.displayedImageName {
self?.contentView.layer.contents = image
}
})
}
})
}
滚动到某一位置以编程时,这使得滚动平滑而不消耗额外的存储器,用于缓存但(例如,当UICollectionView
滚动到顶部)它会导致另一个问题 :在滚动动画过程中,图像不会更新(滚动速度太快无法加载),滚动完成后会显示错误的图像以显示秒数 - 并且一个接一个地替换为正确的图像。这在视觉上非常令人不安。
编辑2:
我不能组小图像成更大组成的图像,并通过this answer的建议显示的那些。
原因:
- 考虑不同的屏幕大小和方向。必须为它们中的每一个预先制作图像,这将使应用下载巨大。
- 小图像可以按不同顺序显示,其中一些可能在某些情况下隐藏。我完全无法为每种可能的组合和顺序预先分解图像。
你需要某种形式的缓存可以从您的需求,标准的图像填充,但随后快速访问一次的事情是建立和运行,从而滚动等是光滑的。以下链接似乎提供了这样的机制。看起来它使用内存映射文件并避免了大部分开销。也许值得一瞧? https://开头github上。com/path/FastImageCache –