09.1
渲染流水线
ArkUI 基于声明式差异比对更新界面。状态变化触发依赖组件重新渲染(re-render),过度刷新是卡顿主因。
用工具定位
DevEco 的 Profiler(CPU/内存/帧率)可定位卡顿与内存热点,先测再优化。
09.2
懒加载列表
长列表必须用 LazyForEach 而非普通 ForEach,只创建可见项,显著降低内存与首屏时间。
List() {
LazyForEach(this.dataSource, (item) => {
ListItem() { Text(item.name) }
}, (item) => item.id)
}DataSource 实现
LazyForEach 需配合 IDataSource 提供总数与取数,框架按需调用,实现真正懒加载。
09.3
状态刷新范围
把 @State 拆到最小粒度,避免一个大对象变更导致整页刷新;用 @Prop/@ObjectLink 精准更新子组件。
@State 大对象
一个大 @State 对象任意字段变化都会重渲染整个组件树读取它的部分。拆小、下沉状态可大幅减少无效刷新。
09.4
组件复用
列表项用 @Reusable 标记可复用组件,框架回收复用实例,减少创建开销。
@Reusable
@Component
struct ItemCell { @State data: Item = new Item(); aboutToReuse(params: Record<string, Object>) { this.data = params.data as Item } }09.5
内存优化
及时释放资源(文件句柄、订阅、动画),避免长生命周期持有组件,用 Profiler 查泄漏。
09.6
启动优化
减少 Ability 创建时的同步重活,把非必要初始化延迟到首屏之后,用懒加载与预构建优化冷启动。
09.7
功耗
合并网络请求、定位按需、减少后台长任务与高频定时器,遵循系统后台约束。
- 合并请求。减少射频唤醒。
- 定位按需。单次获取而非常驻。
- 降频。避免主线程高负载长任务,必要时移到 TaskPool。
09.8
常见陷阱
多半用了普通 ForEach(全量创建)或 @State 大对象导致整页刷新。改用 LazyForEach + 拆小状态 + @Reusable。
常因事件订阅/动画未释放、组件被长生命周期对象持有。在 aboutToDisappear 解绑,用 Profiler 抓引用链。
09.9