【问题标题】:Poor ListView performance on GluonGluon 上的 ListView 性能不佳
【发布时间】:2016-04-24 05:10:42
【问题描述】:

我有一个自定义的ListCell 实现,如下图所示。

左侧,代表日期,由3个标签组成,放入一个VBox和由计数器组成的“CounterContent”,每个数字一个TextField,包含在一个HBox中,和两个 Hboxes 包含 kWh、kWh/天等标签。这似乎太多了,无法高效运行。

我尝试在后台任务中加载数据,在任务运行时显示进度指示器,但与桌面不同,在 android 上的性能非常差。每当我切换到列表视图时,垃圾收集就会启动,并阻塞 ui 线程,因此进度指示器永远不会出现。

我已经在华为 Y-300、Android 4.1.1、javafxports 8.60.6(因为 javafxports 8.60.7 导致错误,导致 TextField 无法使用)和三星 S5 mini、Android 上尝试过5+。在三星手机上,性能总体上要好得多,正如预期的那样,因为我猜是提前编译,但仍然存在垃圾收集问题。此外,在列表视图中填充单元格后,滚动不是很流畅。

listcell 是否复杂或性能不佳可能是什么原因?

更新:

经过大量测试,滚动不流畅似乎不是由性能问题引起的。至少在 S5(javafxports 8.60.7)上。

我删除了所有 css 样式,并用单个标签替换了文本字段(计数器节点已经是一个自定义控件(忘记了),它在 2 Regions(不是 HBoxes)和ListCell 的节点在构造函数中实例化)。此外,我将ListView 切换为CharmListView 并设置android.monocle.input.touchRadius=1。

这些步骤都没有带来显着的改进。

澄清一下:对比华为手机,S5和android 5+上的滚动都可以使用,但不是很流畅,用户体验不太好。

在华为(javafxports 8.60.6)上,更改标签的计数器文本字段带来了显着的改进,但还没有达到滚动可用的程度。直到我设置了这个神奇的实验开关:gluon.experimental.performance=true,这使得列表视图快速滚动(经过一点预热延迟),但仍然不是很流畅。

【问题讨论】:

    标签: gluon gluon-mobile


    【解决方案1】:

    复杂场景的性能降低的原因有很多,因此这里只是列出了可能有助于改进它的可能想法,以任何顺序排列。

    列表单元

    对于初学者来说,单元格中的节点数量非常多。请注意,您所做的每一次滚动都意味着包含可见单元格的虚拟流的完整呈现。对于每个单元格,这意味着重新创建其内容。

    如果不查看您的代码,我无法判断,但您应该避免始终为单元格中的每个节点创建新实例,只有一个实例,并且在 updateItem 方法中只更改节点。

    看看这个sampleNoteCell 类是一个自定义单元格,其中使用了 ListTile

    节点数

    您是否尝试过仅使用 Label 来替换 8 个文本字段和 3 个框?

    缓存

    如果您使用从 Internet 下载的图像,请使用 Gluon Charm Down Cache 以避免重复下载相同的图像。

    看看这个sample。如果没有缓存,即使在桌面上,性能也会受到影响。

    还可以为任何节点使用 JavaFX 内置缓存,尝试不同的缓存策略。

    CSS

    复杂的 CSS 需要较长的 CPU 时间。尝试简化它。甚至您可以删除整个 CSS 以进行快速测试。然后决定你可以使用或不可以使用什么。

    动画也是如此:尽可能避免使用动画、过渡甚至 CSS 效果。

    自定义控件

    counter complex 节点可能会被一个优化渲染的自定义控件替换。

    CharmListView

    您是否尝试过使用 Gluon Charm CharmListView 控件而不是 ListView

    有一个新的实验性标志,您可以使用它来测试可能会在滚动列表时提高性能的优化。在java.custom.properties 文件上设置gluon.experimental.performance=true,然后试一试。

    JavaFXPorts 版本

    您提到您使用 8.60.6 是因为 TextField 错误。在这种情况下,您的 TextField 节点是否可编辑?如果没有,我建议用其他节点替换它们并使用 8.60.7 运行,因为它包含很多性能改进。

    性能工具

    使用Monitor 等性能工具并使用其profiling 选项,这样您就可以追踪任何可能的瓶颈。

    CPU

    最后但同样重要的是:您的移动设备规格始终至关重要。

    尝试在 Cortex A5 上渲染复杂的场景,考虑到“它是最小、成本最低和功耗最低的 ARMv7 应用程序processor”,或者使用非常旧的 Android 4.1.1,都不能很好地执行就像在具有更高规格的全新设备上运行它一样。

    正如您还提到的,在 Cortex A7 上运行的性能“要好得多”。看看这个comparison,找到适合这项工作的架构。

    不管怎样,总有改进的余地,付出了很多努力。我们随时欢迎您的反馈。

    【讨论】:

    • 感谢您提供详细信息!我已经用我采取的步骤更新了我的问题,以进一步调查问题
    • 很高兴您得到了一些改进。您是否尝试过 2015 Gluon 的 JavaOne 应用程序?它使用了一个相当高效的CharmListView 控件,但还没有实验标志。检查您的设备中的滚动是否顺畅。
    • 刚试了一下,在滚动时看到了同样的小“跳跃”,所以我的列表单元实现并没有像我一开始所预期的那样造成这种效果。在 Web 视图中滚动,例如超级光滑。
    • 似乎大量的布局容器(4 个 hBoxes,2 个 vBoxes)对性能的影响最大。将它们替换为负责布局的自定义组件后,性能得到了显着提升,无论是否使用实验性开关都没有区别。
    • 我刚刚实现了CharmListView 的超级平滑滚动,在headerCellfloatingHeaderCell 被“连接”的那一瞬间。这种行为可以应用于一般的滚动吗? (我知道我一直在问同样的问题,但我仍然对滚动性能不满意,特别是因为我的一个应用程序Orienteering 中的一个显示非常流畅的滚动,我只是无法重现。使用相同的 ListCells、styleSheets,甚至试图移除 fab 层,看看是否有什么不同。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多