0

我正在为我应该在这里展示什么代码而苦苦挣扎,因为它非常复杂并且它同时工作。

问题是我构建了一个相对复杂的 JavaFX 场景图,并用它从 Scala 应用程序更新了 VBox 的内容。

现在,当我使用 sbt run 运行应用程序时,使用控制台窗口,sceneragph 加载速度很快。当我从打包的 .jar 运行它时(我为此使用 sbt-one-jar),sceenraph 需要很长时间才能加载。

所以一切都在工作,一切都以同样的方式工作,除了从 .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 小部件构建自定义小部件的类。构建场景图后,更新需要相同的时间。

4

1 回答 1

1

可能有两件事会减慢您的启动速度:加载类和增长 JVM 堆。您也可能为应用程序分配更少的内存,这会降低整体速度。

除非您fork := true在您的 中设置,否则您将在与构建build.sbt相同的过程中运行您的应用程序。java这意味着你所有的启动税(类加载、堆增长)都已经支付了。

不幸的是,没有办法加快类加载。但是,您可以Xms通过在命令中同时设置和Xmx标志来显着加快堆增长java

# This is 2 GB. Pick an appropriate value for your app. 
java -Xms2g -Xmx2g -jar my.jar
于 2017-02-07T19:59:45.207 回答