我正在尝试在XYChart
中为音频文件绘制波形。我有一系列样本。但是将每个样本添加到XYChart.Data
,然后通过for循环将XYChart.Data
添加到XYChart.Series
,即使是2秒的文件也需要太长时间。有没有其他方法可以一次性将样本数组中的所有值添加到Series
?以下是我目前的代码:
XYChart.Series<Integer,Double> dataSeries1 = new XYChart.Series<>();
XYChart.Data<Integer,Double> data = new XYChart.Data<>();
for (int i=0;i<numsamples;i++) {
data = new XYChart.Data<Integer,Double>( i, samples[i]);
dataSeries1.getData().add(data);
}
lineChart.getData().clear();
lineChart.getData().add(dataSeries1);
答案 0 :(得分:0)
我猜你要求这部分代码:
for (int i=0;i<numsamples;i++) {
data = new XYChart.Data<Integer,Double>( i, samples[i]);
dataSeries1.getData().add(data);
}
您可以先在另一个集合中收集它,然后一次性添加它们:
Collection<XYChar.Data<Integer,Double>> samples = new ArrayList<>(numsamples);
for (int i = 0; i < numsamples; i++) {
XYChart.Data sample = new XYChart.Data<Integer,Double>( i, samples[i]);
samples.getData().add(sample);
}
dataSeries1.getData().addAll(samples);
然而,我认为你不会在这方面遇到性能提升。它甚至可能更慢,因为必须在addAll
函数中再次复制数据点。
在这两种情况下,您都要将数据添加到集合中。当您添加控件时不会尝试重新绘制自身,它只是指示它已经失效的平台并在下一个可用脉冲上请求重新布局。当你的循环在平台线程上时,下一个脉冲将不会发生,直到你完成循环。
要么花费很多时间来添加所有的采样点,一旦你将它添加到数据系列中,图表就需要花费很多时间来绘制它们。如果你有一个大型系列,控制真的需要一些时间。
或者,您可以在Task
中创建样本数据集,在其中您可以在另一个线程中创建样本集合,并在task completion上一次性应用它们。创建集合仍将花费时间 - 但不会阻止平台线程 - 并且控件仍需要时间来呈现自身。