JavaFX LineChart Performance
我一直在努力提高JavaFX中LineChart的性能,但没有取得很大的成功。我还发现,这似乎是一些程序员在尝试显示大数据时发现的常见问题(这里的大代表>10,000的数据大小)。例如,这种数据在科学和工程中非常普遍,如果我们能弄清楚如何在JavaFX中加速LineChart,那就太好了。
好吧,我在stackoverflow中发现了两个类似的问题,JavaFX LineChart有65000个数据点和JavaFX LineChart - draw array的性能问题。主题 JavaFX LineChart 的性能问题与 65000 个数据点最终提出了一个建议(由 Adam 提出),即使用 Ramer–Douglas–Peucker 算法!以减少进入线图的数据点数,以加快速度。
然而,在科学和工程数据中,我们通常需要看到绘图形状,然后放大才能看到绘图特定部分的细节。因此,如果我们使用Ramer-Douglas-Peucker算法,每次用户放大/缩小时,我们都需要重新绘制LineChart,我认为这将花费大量的处理成本。
因此,我想知道是否有人在JavaFX中加速LineChart方面有一些提示。下面是一个示例代码,其中包含我到目前为止所学到的内容。
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TestingLineChart extends Application {
@Override
public void start(Stage primaryStage) {
long startTime, endTime;
startTime = System.nanoTime();
StackPane root = new StackPane();
NumberAxis xAxis = new NumberAxis();
NumberAxis yAxis = new NumberAxis();
LineChart<Number, Number> lineChartPlot = new LineChart<>(xAxis, yAxis);
// set them false to make the plot faster
lineChartPlot.setAnimated(false);
lineChartPlot.setCreateSymbols(false);
List<XYChart.Data<Double, Double>> data = new ArrayList<>();
Scene scene = new Scene(root, 300, 250);
endTime = System.nanoTime();
System.out.println("Time (ms) for creation: " + (endTime - startTime)/1e6);
startTime = System.nanoTime();
for (int n = 0; n < 1e5; n++) {
data.add(new XYChart.Data(n, Math.random()));
}
endTime = System.nanoTime();
System.out.println("Time (ms) for adding data: " + (endTime - startTime)/1e6);
startTime = System.nanoTime();
XYChart.Series dataSeries = new XYChart.Series<>();
dataSeries.setName("data"); // taking the data
dataSeries.getData().addAll(data); // taking the data
endTime = System.nanoTime();
System.out.println("Time (ms) for adding data to series: " + (endTime - startTime)/1e6);
startTime = System.nanoTime();
lineChartPlot.getData().add(dataSeries);
endTime = System.nanoTime();
System.out.println("Time (ms) for adding data to LineChart: " + (endTime - startTime)/1e6);
startTime = System.nanoTime();
root.getChildren().add(lineChartPlot);
endTime = System.nanoTime();
System.out.println("Time (ms) for adding LineChart StackPane: " + (endTime - startTime)/1e6);
startTime = System.nanoTime();
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
endTime = System.nanoTime();
System.out.println("Time (ms) for showing: " + (endTime - startTime)/1e6);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
正如您所看到的,如果您运行此代码,最大的成本是渲染,我无法使用这些计时捕获。然后,在我看来,改进应该集中在那里,但我不知道如何。
谢谢。