微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅在多模块项目中出现的 Jetpack Compose 性能问题

如何解决仅在多模块项目中出现的 Jetpack Compose 性能问题

我在 Jetpack Compose 中开发了一个非常复杂的键盘布局。最初,布局工作正常,按下按键时动画运行非常流畅。不幸的是,由于事件的一些重新组合后,动画和一切变得非常缓慢和滞后。 我曾尝试对 Java 方法调用进行采样,但我只能看到某些函数比平时花费的时间要长得多。

编辑: 我已经能够隔离问题。我发现性能问题只出现在多模块项目中。当我将 完全相同的 撰写代码放在根 import numpy as np import imageio global transform_array transform_array = np.zeros((2000,2000,2),dtype='i') # transform_array values are pre-calculated already srcimg_array = np.array(imageio.imread(src_filename)) polarimg_array = np.zeros((outputHeight,outputWidth,3),dtype='uint8') for item in np.ndindex((2000,2000)): XYgrid = transform_array[item[0],item[1]] polarimg_array[[item[1]],[outputHeight - item[0]]] = srcimg_array[XYgrid[0],XYgrid[1]] 模块中时,问题就消失了。

我创建了一个重现该问题的项目:

如果你想在多模块项目中重现这个问题,你必须多次在类别之间切换,然后一切都会变得非常滞后

Example Video

注意:我知道 Jetpack Compose 仍处于 alpha 阶段,这个问题可能是 Jetpack Compose 中的一个错误。但我想确保这不是我的代码错误或 Compose 的一般限制

解决方法

解决方案是对 remember Keyboard 使用可组合的 @Composable 以防止重新组合期间的布局计算。

val refs: List<List<Pair<Key,ConstrainedLayoutReference>>> =
         remember {
             keyboard.map { row ->
                row.map {
                   it to createRef()
               }
          }
}

val modifier = remember { ... }

val modifierPressed = remember { ... }        

源代码: https://github.com/dautovicharis/example_compose-keyboard-multimodule/commits/main

,

总的来说,作为 Jetpack Compose 应用程序并没有什么特别之处。您可以使用 Android Studio 中的 CPU profilerrecord a trace 更具体地查看您的应用程序中发生的情况。在不看代码的情况下很难知道是什么导致某些函数比平时花费的时间更长,但实际上可能是它们被重复调用(采样方法无法区分)。

您还可以在 @Composable 函数中放置打印语句或断点。确保在您不期望它们时不会调用(重构)这些函数。如果是,您需要调查是什么导致他们再次被调用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。