【问题标题】:What makes a JavaFx 1.2 Scene Graph Refresh?是什么让 JavaFx 1.2 场景图刷新?
【发布时间】:2010-11-26 17:20:20
【问题描述】:

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

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

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

1) 使 CustomNode 在绘制时将某些内容打印到控制台。这将帮助我准确确定这些涂料何时排队。

2) 确定何时将 CustomNode 置于重绘队列中。

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

【问题讨论】:

    标签: performance scalability javafx paint scenegraph


    【解决方案1】:

    您可能想阅读这篇文章。

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

    基本上,插入到场景图中很慢,通过批量插入可以看到好处

    【讨论】:

    • 谢谢史蒂文!我以前没有遇到过 fxexperience.com。这是一个很好的资源,这篇文章绝对很有启发性。我一直在做一些猜测和检查优化,并在我的一些组件中放置缓存:true,我已经从 7 FPS 的 100 个六边形的地图变为 13 FPS。它仍然太慢,但它正在变得更好。由于不是所有 100 个都同时出现在屏幕上,我正在考虑某种动态添加/删除,因此只有可见的在场景图中。
    • 新的场景图 (Prism) 应该会在今年晚些时候(11 月/12 月?)到货,这显然有望显着提高性能。
    【解决方案2】:

    这是部分帖子。我希望在完成更多工作后扩展它。我想把我迄今为止所做的事情写下来,以免忘记。

    我意识到我需要使用 JavaFx 1.2 源代码来运行我的 IDE。这将允许我在核心代码中放置断点以弄清楚发生了什么。我决定在 Eclipse 上为remote debugging 进行此配置。我正在 Netbeans 中开发我的 FX,但我更喜欢使用 Eclipse,所以如果可以的话,我想在其中进行调试。

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

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

    我做了一些研究,发现唯一可用的选项是安装 Java 反编译器。我使用这个是因为它很容易安装到 Eclipse 3.4 中:httpcolon_ //java dot decompiler _dot free.fr/ (

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

    我发现了一个有用的基准测试工具:

    如果您使用 JVM arg 运行:

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

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

    处理程序 = java.util.logging.ConsoleHandler java.util.logging.ConsoleHandler.level = 全部 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。

    【讨论】:

      【解决方案3】:

      JavaFX 脚本是一种强大的 UI 语言,但某些做法会影响性能。最佳性能通常归结为:

      • 保持场景图较小

      • 尽量减少使用绑定(您可以考虑使用性能更高的触发器)

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

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

      【讨论】:

      • 嗨 Mash 感谢您的建议。我读过那篇文章,并认为我明白了。问题是该帖子没有为您提供任何分析方法来找出导致延迟的具体原因。我做了一些分析,并相信我的代码中的大部分计算时间都花在了 JSGPanelRepainter.repaintAll() 中。问题是我的模型或演示都没有以需要完全重新绘制的方式发生变化。这让我想知道是什么触发了 repaintAll()。我只是不知道如何追踪它。干杯。
      • @Spina 在 JFX 1.2 中,重绘经常发生,即使是不必要的。 1.3 应该有更好的性能,只有在绝对必要时才选择性地重绘。 Amy Fowler 在此演示文稿 (steveonjava.com/2009/12/18/javafx-layout-secrets) 中指出了这个问题。
      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 2016-07-28
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      相关资源
      最近更新 更多