-
长列表优化概述
- 10000条数据量下ForEach和LazyForEach对比效果,后者在启动、加载、滑动效果更为明显,更加流畅
- 优化方法
- 懒加载: 列表数据按需加载
- 缓存列表项: 提供屏幕可视区域外列表项长度的自定义调节能力
- 组件复用: 降低相同组件短时间内频繁创建和销毁的开销
- 布局优化: 使用扁平化布局方案,减少视图嵌套层级和组件数
- 三个关键指标:
- 完全显示所用时间TimeToFullDisplayTTFD、生成完整第一帧的时间
- 丢帧率JankyFrames、11.1ms内不能完成第一帧的绘制,就会出现丢帧
- 独占内存UniqueSetSizeUSS、运行一个特定进程的增量成本
-
懒加载
-
ForEach渲染
-
LazyForEach懒加载,需要实现IDataSource接口,参见API
-
第一种方法适合少量数据,第二种适合大量数据
-
图示
-
懒加载,在华东速度过快时,数据来不及加载而出来白块
-
-
缓存列表项
-
预先将屏幕可视区外指定数量的列表项数据缓存
-
图示
-
设置cachedCount来指定缓存数量,减少出现白块的现象,数量一般为屏幕显示的列表数的二分之一
-
大内存资源可以更少,小内存资源,或者浏览较差可以,更多,及c值更大
-
-
组件复用
- 可复用组件从组件树上移除时,会进入到一个回收缓存区,后续创建新组件节点时,会服用缓冲区的节点
- 图示
- 回收区实际是一个k-v键值对,有多种可复用的组件,一般回收的时候,去掉数据,保留样式结构
- 通常服用组件有三个步骤,使用@Reusable,实现自定义组件的生命周期回调函数,可以在这里设置数据填充的逻辑,设置可复用组件的ID,
- 在复用组件前后,丢帧率会发生明显的改变,服用组件大大提升性能,缩短了BuildLazyItem耗时。把3.7%丢帧率直接缩小到0
-
布局优化
- 错误的布局方法导致组件树和嵌套层过多
- 图示
- 一般最大嵌套层级控制在5-8层
- 假设25层嵌套,那么相对布局两层,线性布局五层,对比效果就会非常明显,如上图
HarmonyOS长列表性能优化
于 2024-07-18 18:04:05 首次发布