当 Compose 更新帧时,它会经历三个阶段
- 合成:Compose 确定显示什么。它运行可组合函数并构建 UI 树。
- 布局:Compose 确定 UI 树中每个元素的大小和位置。
- 绘图: Compose 实际上渲染各个 UI 元素。
Compose 可以智能地跳过任何不需要的阶段。例如,假设单个图形元素在两个相同大小的图标之间切换。由于此元素的大小没有变化,并且 UI 树的任何元素都没有添加或删除,因此 Compose 可以跳过组合和布局阶段,并重新绘制此一个元素。
但是,编码错误可能使 Compose 难以知道可以安全跳过哪些阶段,在这种情况下,Compose 会运行所有三个阶段,这可能会降低 UI 速度。因此,许多性能最佳实践旨在帮助 Compose 跳过它不需要执行的阶段。
有关更多信息,请参阅Jetpack Compose 阶段指南。
一般原则
有一些广泛的原则可以遵循,这些原则可以总体上提高性能
- 尽可能将计算移出可组合函数。可组合函数可能需要在 UI 发生变化时重新运行。您放在可组合函数中的任何代码都会重新执行,对于动画的每一帧都有可能重新执行。将可组合函数的代码限制为仅构建 UI 所需的内容。
- 尽可能延迟状态读取。通过将状态读取移到子可组合函数或稍后的阶段,您可以最大程度地减少重新组合或完全跳过组合阶段。您可以通过传递 lambda 函数而不是频繁更改状态的状态值,以及在传递频繁更改状态时优先使用基于 lambda 的修饰符来做到这一点。您可以在尽可能延迟读取部分中看到此技术的示例,该部分位于遵循最佳实践中。