在哪种情况下应该使用每种JavaFX更新方法?

时间:2017-01-16 11:24:31

标签: java performance javafx javafx-8

据我所知,有三种方法可以更新JavaFX元素:

  • Platform.runLater();

  • Task

  • Timeline

在我的具体情况下,我每750-1000毫秒收到一次数据,而我在JavaFX中所做的就是每1000毫秒更新一次LineChart。每1000毫秒,我称这种方法:

mySeries.getData().add(myIndex,myNewDoubleValue);

关于"逻辑"我没有性能问题。对于软件,一切都按时运行,并且在窗口最小化时仅使用0-1%的CPU。

当我在屏幕上显示界面窗口而每秒更新时出现问题,我得到30-45%的CPU使用率(这是一个问题,因为我的软件不是PC上运行的唯一一个,并且我需要消耗尽可能少的资源。)

这是我最近的尝试:

Timeline refreshChart = new Timeline(new KeyFrame(Duration.ZERO, new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        mySeries.getData().add(myIndex,myNewDoubleValue);
    }
}), new KeyFrame(Duration.seconds(1)));
refreshCharts.setCycleCount(Timeline.INDEFINITE);
refreshCharts.play();

我尝试使用带有Platform.runLater()的while()循环来每秒更新,我也尝试使用Tasks(JavaFX Task类),所有这些都显示出类似的性能(最小化时CPU使用率很低,但是很大实际显示界面时的CPU使用情况。)

注意:我还将图表设置为不动画,因为我认为这是问题,它有所帮助,但并没有真正解决任何问题:

myChart.setAnimated(false);

我应该使用什么方法?我错过了什么吗?如何降低CPU使用率?

更新:我使用``执行了该软件,这是它打印的信息:

Prism pipeline init order: es2 es1 sw j2d
Using native-based Pisces rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.sun.prism.es2.ES2Pipeline
GraphicsPipeline.createPipeline failed for com.sun.prism.es2.ES2Pipeline
java.lang.ClassNotFoundException: com.sun.prism.es2.ES2Pipeline
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:187)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:91)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
    at java.lang.Thread.run(Unknown Source)
Prism pipeline name = com.sun.prism.es1.ES1Pipeline
GraphicsPipeline.createPipeline failed for com.sun.prism.es1.ES1Pipeline
java.lang.ClassNotFoundException: com.sun.prism.es1.ES1Pipeline
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:187)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:91)
    at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:124)
    at java.lang.Thread.run(Unknown Source)
*** Fallback to Prism SW pipeline
Prism pipeline name = com.sun.prism.sw.SWPipeline
(X) Got class = class com.sun.prism.sw.SWPipeline
Initialized prism pipeline: com.sun.prism.sw.SWPipeline
     vsync: true vpipe: false

0 个答案:

没有答案