据我所知,有三种方法可以更新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