首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何提高包含大量小图片的UCollectionView的性能?

如何提高包含大量小图片的UCollectionView的性能?
EN

Stack Overflow用户
提问于 2015-08-03 18:57:37
回答 7查看 2.8K关注 0票数 17

在我的iOS应用程序中,我的UICollectionView可以显示大约1200个小图像(35x35点)。图像存储在应用程序包中。

我正确地重用了UICollectionViewCell,但仍然存在性能问题,这取决于我如何处理图像加载:

  • My app是应用程序扩展,那些内存有限的应用程序(本例中为40 MB )。将所有1200个图像放入资产目录并使用UIImage(named: "imageName")加载它们会导致内存崩溃-系统缓存的图像会填满内存。在某些情况下,应用程序需要分配更大的内存部分,但由于缓存的图像,这些内存不可用。操作系统没有触发内存警告和清除缓存,而是直接终止了应用程序。
  • I更改了方法,以避免图像缓存。我将图像作为png文件放到我的项目中(而不是放到asssets目录中),现在我正在使用NSBundle.mainBundle().pathForResource("imageName", ofType: "png")加载它们。应用程序不再因为内存错误而崩溃,但加载单个图像的时间要长得多,即使在最新的iPhones上,快速滚动也会滞后。

我可以完全控制图像,可以将它们转换为.jpeg或优化它们(我已经尝试了ImageOptim和其他一些选项,但都没有成功)。

如何一次解决这两个性能问题?

EDIT 1:

我还尝试在后台线程中加载图像。这是我的UICollectionViewCell子类中的代码

代码语言:javascript
运行
复制
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滚动到顶部时)它会引起另一个问题:在滚动动画期间图像没有更新(滚动太快,无法加载),滚动完成后,错误的图像显示了几分之一秒-一个接一个地被正确的图像替换。这在视觉上是非常令人不安的。

EDIT 2:

我无法将小图像分组为较大的合成图像,并按照this answer的建议显示这些图像。

原因:

  • 考虑不同的屏幕大小和方向。它们中的每一个都必须有预先合成的图像,这将使应用程序的下载量很大。
  • 小图像可以按不同的顺序显示,其中一些可能在某些情况下被隐藏。我肯定不能为每个可能的组合和订单预先合成图像。
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31785490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档