什么会导致JavaFx 1.2场景图刷新?

4

我的第一个问题 =)。我正在使用JavaFx编写带有用户界面的视频游戏。虽然行为正确,但我遇到了性能问题。我试图找出是什么在排队刷新导致应用程序变慢。

我有一个相对复杂的场景图,代表一个六边形地图。它缩放,以便您可以在地图上拥有100或1000个六边形。随着六边形数量的增加,GUI的响应性会降低。我使用YourKit(一个Java分析器)将这些延迟跟踪到主要的重绘操作。

我花了大部分时间尝试解决两件事并理解一件事:

1)当CustomNode被绘制时,让其打印一些内容到控制台。这将帮助我准确地确定这些绘画何时被排队。

2)确定何时将CustomNode放入重绘队列中。

如果我回答了1和2,我可能能够弄清楚是什么将所有这些不同的节点绑定在一起。 JavaFX是否只通过全局刷新工作(可疑)?

3个回答

3
JavaFX脚本是一种强大的UI语言,但某些做法会影响性能。最佳性能通常归结为:
- 保持场景图小 - 将绑定的使用降至最低(可以考虑使用触发器,这样更有效率)
Jim Weaver的博客文章扩展了这些要点。
我不确定关于您问题的具体答案。如果您检查1.2.1文档,可能会找到可以覆盖并添加println语句的节点文档中的某个点,但我不确定是否可以实现。您可以尝试在sun.com论坛上发布。

嗨 Mash,感谢你的建议。我已经阅读了那篇文章,并且认为我理解了它。问题是,这篇文章没有给出任何分析方法来找出特定原因引起的延迟。我进行了一些分析,并相信我的代码中大部分计算时间都花费在JSGPanelRepainter.repaintAll()上。问题在于,我的模型或演示方式都没有以需要完全重新绘制的方式发生变化。这导致我想知道是什么触发了repaintAll()。我不知道如何跟踪它。干杯。 - Spina
@Spina 在JFX 1.2中,即使不必要,重绘频繁发生。1.3应该具有更好的性能,仅在绝对必要时选择性地重新绘制。艾米·福勒在这个演示(http://steveonjava.com/2009/12/18/javafx-layout-secrets/)中指出了这个问题。 - Mike Caron

1

这是一个部分帖子。我预计在完成更多工作后扩展它。我想把我到目前为止做过的事情放进去,以便不会忘记。

我意识到我需要让我的IDE与JavaFx 1.2源代码的完整配套运行。这将允许我在核心代码中设置断点以弄清楚发生了什么。我决定在远程调试使用Eclipse进行此配置。我正在Netbeans中开发我的FX,但在Eclipse中更加熟悉,所以如果可以的话,我想在其中进行调试。

为了将这些信息导入Eclipse中,我首先创建了一个包含我的代码使用的Java源代码的项目。然后我向项目添加了外部Jars。在我的Mac上,我链接的Jars位于/Library/Frameworks/JavaFX.framework/Versions/1.2

然后我开始寻找要链接到这些Jars的源代码。不幸的是,它不可用。我在/Library/Frameworks/JavaFX.framework/Versions/1.2/src.zip中找到了其中的一些。

我进行了一些研究,发现唯一可用的选项是安装Java反编译器。我使用了这个,因为它很容易安装到Eclipse 3.4中:http colon_ //java dot decompiler _dot free.fr/(<--请原谅伪链接,因为我是新手)

这就是我现在的情况。我可以进入Core FX类并相信我将能够设置断点并开始真正的分析。随着我的进展,我会更新这篇文章。

我找到了一个有用的基准测试工具:

如果您使用JVM参数运行:

-Djava.util.logging.config.file=/path/to/logging/file/logging.properties

你把以下参数放入由该参数引用的文件中:

handlers = java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level = ALL java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter com.sun.scenario.animation.fps.level = ALL

你将获得包括每秒帧数的控制台输出。对于FX 1.2,它对我不起作用,但它似乎对1.2.1(发布于2009年9月9日)有效。我还没有运行1.2.1的Netbeans。


1

谢谢Steven!我以前没有接触过fxexperience.com。这是一个不错的资源,这篇文章确实很有启发性。我一直在进行猜测和检查优化,并在我的一些组件中加入了cache: true对于一个包含100个六边形的地图,我的帧率从7 FPS提高到了13 FPS。虽然速度仍然太慢,但已经有所改善。由于并非所有100个六边形都同时出现在屏幕上,我正在考虑一些动态添加/删除的方法,以便只有可见的对象在场景图中。 - Spina
新的场景图(Prism)应该会在今年晚些时候到来(11月/12月?),据说它承诺显着提高性能。 - Steven Herod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接