【发布时间】:2017-02-06 11:56:08
【问题描述】:
我正在为我应该在这里展示什么代码而苦恼,因为它非常复杂,而且它同时工作。
问题是我构建了一个相对复杂的 JavaFX 场景图,并用它从 Scala 应用程序更新了 VBox 的内容。
现在,当我在控制台窗口中使用 sbt run 运行应用程序时,sceneragph 加载速度很快。当我从打包的 .jar 运行它时(我为此使用 sbt-one-jar),场景需要很长时间才能加载。
所以一切正常,一切正常,除了从 .jar 运行会神奇地减慢速度。
反正我贴了一些代码,虽然不是很有启发性:
def SetVboxSceneGraph(
id:String,
blob:String,
handler:(MyEvent)=>Unit
)
{
val comp=MyComponent.FromBlob(blob,handler)
comp.CreateNode
val box=GetMyBox(id)
val vbox=box.GetNode.asInstanceOf[VBox]
vbox.getChildren().clear()
vbox.getChildren().add(comp.GetParent)
}
编辑:
根据 sillyfly 的建议,我测量了每一步更新场景图的时间。减慢的步骤是:
comp.CreateNode
这是负责从 XML 标记(作为“blob”传递)构建 JavaFX 场景图的部分,我开发该标记来描述所谓的“MyComponent”,它们是从现有 JavaFX 小部件构建自定义小部件的类。构建场景图后,更新所需的时间相同。
【问题讨论】:
-
任何场景图都会发生这种情况,还是内容很重要?您能否尝试缩小哪个步骤需要更多时间,例如
System.nanoTime(参见 this answer)? -
我还想到,知道哪一步确实慢下来会很有用。我在应用程序中有一个 Timer 类,它使用 System.nanoTime 并且可以以不同的单位报告经过的时间。如果我知道哪个步骤负责,我会更新问题。
-
问题已更新。
-
好吧,既然您知道哪种方法很慢,如果您可以将其包含在问题中(或将其缩小到您可以发布的MCVE)可能会有所帮助。
-
方法没问题,不然在sbt run下跑不快。如果它有任何系统问题,它也会在 sbt run 下运行缓慢。代码太复杂,无法缩小范围,这里是完整的来源:github.com/scalasbtguiapps/test/blob/master/src/main/scala/…。它基本上将每个 MyComponent 转换为各自的 JavaFX 场景图( MyComponents 可能包含多个小部件)。它递归地执行此操作,因此构建图的父组件会构建整个图。
标签: performance scala javafx sbt scenegraph