事情会加速你的懒惰清单
-
如果你处于调试模式,这是正常的。如果您的应用程序在调试过程中出现延迟,请不要担心。完全没问题。只需在发布模式下创建 APK(构建 -> 生成签名包/APK),这可能会解决您的问题。发生这种情况是因为在调试时,Compose 使用 JIT 在运行时翻译字节码。确保您也在使用R8编译器在发布版本中。这对于提高总体性能非常重要。
-
为您的项目设置密钥。像这样初始化你的惰性列表。
LazyColumn() {
items(
count = cartItems.size,
key = {
cartItems[it].cartItem.id
},
itemContent = { index ->
val cartItemData = cartItems[index]
CartItemWithActions(data = cartItemData)
Divider(
color = colorResource(id =R.color.separator_line)
)
}
)
}
设置密钥的工作方式类似于DiffUtil
班级在RecyclerView
。检查Maciej Przybylski 的帖子 https://stackoverflow.com/questions/69856439/lazycolumn-is-slower-than-column-with-vertical-scroll.
- 确保每个变量都使用
remember{}
block.
@Composable
fun MyComposable() {
...
val wrongList = myViewModel.getList() // <- Don't do this
val correctList = remember { myViewModel.getList() } // <- Do this
...
}
-
您还可以使用contentType
,它定义列表中对象的类型。如果列表中有标题或不同类型的对象,这非常有用。了解更多here https://developer.android.com/reference/kotlin/androidx/compose/foundation/lazy/LazyListScope.
-
基线配置文件。如果您已经尝试了所有方法,但您的列表仍然缺少帧,则可能是这样。在这个talk https://www.droidcon.com/2022/06/28/making-apps-blazing-fast-with-baseline-profiles/, Rahul Ravikumar(Google 工程师)揭示了基线配置文件如何将性能提高高达 40%。这是什么? Compose 是一个库,而不是本机 XML。这意味着每次执行应用程序时,都必须在运行时翻译代码。您可以在使用基线配置文件安装应用程序时预执行并保存所有这些代码。检查这些链接:基线配置文件 https://developer.android.com/topic/performance/baselineprofiles, 使用基线配置文件提高性能 https://medium.com/androiddevelopers/improving-performance-with-baseline-profiles-fdd0db0d8cc6.
检查这些资源,再也不会出现性能问题。我强烈建议观看这些视频:优化 Jetpack Compose 的渲染性能 https://youtu.be/Ry-3xlElUe4, Jetpack Compose 的性能最佳实践 https://youtu.be/EOQB8PTLkpY,和阅读这个帖子 https://stackoverflow.com/questions/71807439/how-optimize-jetpack-compose-list-performance.
一个好消息
一般来说,与 XML 相比,Jetpack Compose 的性能并不好。我们现在知道这个问题是由于修饰符的创建方式造成的。我强烈建议你观看这个视频 https://youtu.be/BjGX2RftXsU。好消息是,Jetpack Compose 团队几个月来一直在研究一种提高性能的新方法。这种新方法利用了Modifier.Node
以避免在幕后执行大量无用的操作。这种方法最好的一点是,您不需要更改代码中的任何内容,并且它将完全兼容。
可从 Jetpack Compose 获取1.5.0
原答案
解决了!读这篇文章我发现问题只出在调试版本。这看起来很疯狂,但却是事实。这是因为 Compose 应用程序的调试版本在幕后发生了很多事情,这会影响性能(与 Flutter 中发生的情况非常相似)。解决问题你唯一需要做的事是创建应用程序的发布版本。为此,请转至Build -> 生成的签名包/APK。创建密钥,然后选择release.
享受流畅的应用程序吧!