滚动时将部分插入 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:
、collectionViewContentSize
、prepareLayout
编写自定义方法?这种方法看起来如何?
我的其他观察:
添加的部分越频繁,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 中选择时将单元格扩展到全屏