2

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

在此处输入图像描述

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

我尝试在后台任务中加载数据,在任务运行时显示进度指示器,但与桌面不同,在 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. 此外,我切换了ListViewaCharmListView并设置了 android.monocle.input.touchRadius=1。

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

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

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

4

1 回答 1

5

复杂场景的性能降低的原因有很多,所以这只是一个可能有助于改进它的想法列表,以任何顺序。

列表单元

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

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

看看这个样本。该类NoteCell是一个自定义单元格,其中ListTile使用了 a。

节点数

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

缓存

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

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

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

CSS

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

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

自定义控件

计数器复杂节点可能会替换为优化渲染的自定义控件。

魅力列表视图

您是否尝试过使用 Gluon CharmCharmListView控件而不是ListView?

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

JavaFXPorts 版本

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

性能工具

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

中央处理器

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

尝试在 Cortex A5 上渲染复杂场景,考虑到“它是最小、成本最低和功耗最低的 ARMv7 应用处理器”,或者使用非常旧的 Android 4.1.1,性能不如在具有更高规格的全新设备。

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

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

于 2016-04-24T09:15:12.157 回答