什么使JavaFx 1.2场景图刷新?

时间:2009-09-09 04:47:12

标签: performance scalability javafx paint scenegraph

我的第一个问题=)。我正在编写一个带有用JavaFx编写的用户界面的视频游戏。行为是正确的,但我遇到了性能问题。我正在试图弄清楚如何排队正在减慢应用程序的刷新排队。

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

我花了大半夜的时间试图弄清楚如何做两件事并理解一件事:

1)导致CustomNode在绘制时将某些内容打印到控制台。这有助于我准确确定这些涂料的排队时间。

2)确定何时将CustomNode放置在排队的重绘上。

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

3 个答案:

答案 0 :(得分:3)

JavaFX脚本是一种功能强大的UI语言,但某些实践会破坏性能。最佳表现通常归结为:

  • 保持场景图小

  • 将bind的使用保持在最低限度(你可以看看使用触发器而不是更高效)

Jim Weaver的blog post扩展了这些观点。

我不确定您问题的具体答案。如果您检查1.2.1文档,您可以在Node文档中找到一个可以覆盖并添加println语句的点,但我不确定是否可以完成。您可以尝试在forums.sun.com

上发帖

答案 1 :(得分:1)

这是部分帖子。我希望在完成更多工作后扩展它。我想介绍我迄今为止所做的事情,所以我不会忘记。

我意识到我需要让我的IDE运行完整的JavaFx 1.2源代码。这样我就可以在核心代码中加入断点来弄清楚发生了什么。我决定在Eclipse上为remote debugging执行此配置。我正在使用Netbeans开发我的FX,但是对Eclipse更熟悉,所以如果可以的话,那就是我想调试的内容。

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

然后我去寻找源链接到这些罐子。不幸的是,它不可用。我可以在/Library/Frameworks/JavaFX.framework/Versions/1.2/src.zip中找到一些。

我做了一些研究,发现剩下唯一可用的选项是安装Java Decompilier。我用过这个,因为它很容易安装到Eclipse 3.4中:http colon_ // java dot 反编译器_dot free.fr/(< - 请原谅psudo链接,我有限,因为我'是新的)

这就是我现在所处的位置。我可以导航到Core FX课程,并相信我将能够设置断点并开始真正的分析。随着我的进步,我会更新这篇文章。

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

如果您使用JVM arg:

运行

-Djava.util.logging.config.file = /路径/到/记录/文件/ logging.properties

并且您已将以下args放入该arg所引用的文件中:

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。

答案 2 :(得分:1)

您可能想阅读这篇文章。

http://fxexperience.com/2009/09/performance-improving-insertion-times/

基本上,插入到场景图中的速度很慢,并且可以通过批量插入

来看到好处