滚动时将部分插入 UICollectionView 时的性能问题

Posted

技术标签:

【中文标题】滚动时将部分插入 UICollectionView 时的性能问题【英文标题】:Performance issue when inserting sections into UICollectionView while scrolling 【发布时间】:2015-04-02 15:15:47 【问题描述】:

基本上我使用默认的UICollectionViewFlowLayout。当我使用insertSections 时,确实需要一些时间。特别是如果用户滚动这会带来一些口吃。我正在使用自动布局,在我的自定义UICollectionViewCell 上放置一个标签。我正在将单元格和我的补充视图(标题)出列。这里没什么特别的。

这是时间分析器的截图

您可以在此处看到UICollectionViewFlowLayout 中的prepareLayout 确实消耗了可用CPU 功率的三分之一。有没有可能加快这个速度?例如。为layoutAttributesForElementsInRect:layoutAttributesForItemAtIndexPath:collectionViewContentSizeprepareLayout 编写自定义方法?这种方法看起来如何?

我的其他观察:

添加的部分越频繁,performBatchUpdates 插入部分(大约 420 个项目)所需的时间就越长。我每次都添加相同数量的项目。我用 Instruments 做了一些测试。发生卡顿时 CPU 使用率超过 100%。实际内存使用量正在增加,但我以大约 60 MB 结束了我的测试。当时在数据集中加载了大约 48.000 个单元格(大约 45 个始终在屏幕上)。一旦加载了单元格,滚动就会流畅地工作(CPU 大约 100% 最大。但只有很短的时间,用户不会注意到)。在另一个测试中,分配的总字节数约为 1.6 GB,但持久性仍然很低。如果插入新的部分,帧也会下降到 0。

我试图摆脱单元格的自动布局,对单元格使用不透明的背景颜色,对单元格使用剪辑到边界,使用shouldRasterize 等等。单元格不重叠,不应使用小数值(四舍五入的宽度)。我根本不使用阴影。我也试着评论一下,看看有什么问题,但我认为这一定是必不可少的。我在模拟器以及不同的设备上进行了测试。

有人知道如何在插入部分时提高性能吗?

【问题讨论】:

【参考方案1】:

图片附件的调用树中有很多未解析的符号。您可以尝试缩小仅包含 MonthView 应用程序的调用树函数之一的性能问题。

尝试检查Hide System Libraries 并使用Debug 作为构建配置,这样您就可以观察这些符号并导航到应用中的特定代码。

一旦您清楚您的集合视图数据源或委托不会导致UICollectionView 框架级别的性能问题,那么您可以努力寻找一种方法来最小化此类集合视图部分更新。

也许您的单元格自动布局配置相当复杂,您可以简化它吗?

虽然如果不实际查看您的集合视图单元格的内容,很难理解。

【讨论】:

以上是关于滚动时将部分插入 UICollectionView 时的性能问题的主要内容,如果未能解决你的问题,请参考以下文章

启用collectionview分页时将collection view滚动到索引

UICollectionView。如何在幕后插入新项目?

在 UICollectionView 中选择时将单元格扩展到全屏

当视图显示为幻灯片时,自动滚动 UICollectionView 元素。

UICollectionView 的每个部分的独立滚动?

滚动 UICollectionView 到部分标题视图