Compose 阶段和性能

Compose 更新帧时,会经历三个阶段

  • 组合 (Composition): Compose 确定显示什么。它运行可组合函数并构建 UI 树。
  • 布局 (Layout): Compose 确定 UI 树中每个元素的大小和位置。
  • 绘制 (Drawing): Compose 真正渲染各个 UI 元素。

如果不需要,Compose 可以智能地跳过任何这些阶段。例如,假设单个图形元素在相同大小的两个图标之间切换。由于此元素的大小没有改变,并且 UI 树中没有添加或删除任何元素,因此 Compose 可以跳过组合和布局阶段,并重新绘制此单个元素。

但是,编码错误可能会使 Compose 难以知道它可以安全跳过哪些阶段,在这种情况下,Compose 会运行所有三个阶段,这可能会降低 UI 的速度。因此,许多性能最佳实践都是为了帮助 Compose 跳过不需要执行的阶段。

更多信息,请参阅 Jetpack Compose 阶段 指南。

一般原则

有一些广泛的原则可以遵循,这些原则可以总体上提高性能

  • 尽可能将计算移出可组合函数。 可组合函数可能需要在 UI 更改时重新运行。您在可组合函数中放入的任何代码都会被重新执行,对于动画的每一帧都可能如此。将可组合函数的代码限制为仅构建 UI 所需的内容。
  • 尽可能推迟状态读取。 通过将状态读取移动到子可组合函数或稍后的阶段,您可以最大限度地减少重新组合或完全跳过组合阶段。您可以通过传递 lambda 函数而不是状态值(对于频繁更改的状态)以及在传递频繁更改的状态时优先使用基于 lambda 的修饰符来实现这一点。您可以在 遵循最佳实践尽可能推迟读取 部分看到此技术的示例。

其他资源