什么是重组

Compose 靠函数描述界面。状态一变,Compose 会重新执行相关函数、更新界面——这个过程叫重组。它是声明式的优势:你只管描述,框架负责刷新。

重组本身不是问题,过度重组才是。

这篇把 Compose 性能优化的几个关键点走一遍。

重组为什么会卡顿

一个父状态一变,整屏子函数全重跑,哪怕子项的数据根本没变。列表一长、滚动时每帧都重组一大堆,就掉帧卡顿。屏幕刷新率是固定的,每一帧留给你的时间就那么多,重组花超了这一帧,画面就来不及更新,用户看到的就是卡顿。所以 Compose 性能优化的核心不是把函数写快一点,而是让不该重跑的函数一次都别重跑。

Compose 性能速查
  • 重组状态变就重跑,越少越好。
  • 懒加载只渲染屏幕内项。
  • remember缓存计算,别每帧重算。

让重组跳过不必要的部分

把数据拆细,让只依赖自己数据的子项独立重组。把列表项数据存成不可变对象,数据没变 Compose 就跳过它。越细的拆分意味着越多的跳过机会,滚动也就越省。

@Composable
fun Item(item: RowItem) {
  // item 没变就跳过重组
  Text(item.title)
}

数据相等就跳,滚动自然顺。

懒加载列表

别用 Column 硬塞几百行。用 LazyColumn,它只渲染屏幕上看得到的那几项,划出去的回收掉。

Compose 性能:一个发光界面组件节点周围环绕数据流线、性能仪表盘与速度光带的蓝调插画
数据流线:只渲染看得到的那几项。