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