2017-10-06 33 views
0

J'essaye de tracer une forme d'onde en XYChart pour un fichier audio. J'ai un tableau d'échantillons. Mais l'ajout de tous les échantillons à XYChart.Data puis l'ajout de XYChart.Data à XYChart.Series via une boucle for prend trop de temps même pour un fichier de 2 secondes. Existe-t-il un autre moyen d'ajouter toutes mes valeurs dans le tableau d'échantillons à Series en une seule fois? Ci-dessous mon code actuel:Ajout de XYChart.Data à XYChart.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); 

Répondre

0

Je suppose que vous demandez cette partie du code:

for (int i=0;i<numsamples;i++) { 
    data = new XYChart.Data<Integer,Double>(i, samples[i]); 
    dataSeries1.getData().add(data); 
} 

Vous pourriez d'abord recueillir dans une autre collection, puis les ajouter à la fois:

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); 

Cependant, je ne pense pas que vous ferez l'expérience d'une amélioration des performances avec ceci. Il peut même être plus lent car les points de données doivent être copiés à nouveau dans la fonction addAll.

Dans les deux cas, vous ajoutez des données à une collection. Lorsque vous ajoutez le contrôle n'essaie pas de se replacer, il indique simplement la plate-forme qu'il a invalidée et demande un relais sur la prochaine impulsion disponible. Comme votre boucle est sur le fil de la plate-forme, l'impulsion suivante ne se produira pas tant que vous n'aurez pas terminé votre boucle.

Cela prend autant de temps pour ajouter tous les points d'échantillonnage, et une fois que vous l'avez ajouté à la série de données, le graphique a besoin de tellement de temps pour les tracer tous. Si vous avez une grande série, le contrôle a vraiment besoin de temps.

Vous pouvez également créer les échantillons dataseries dans un Task, où vous créez la collection d'échantillons dans un thread différent et les appliquez tous en même temps sur task completion. La création de la collection prendra toujours son temps - mais ne bloque pas le thread de la plateforme - et le contrôle aura encore besoin de temps pour se rendre.

+0

Merci! Le code a fonctionné comme un charme. –

+0

Y a-t-il eu une amélioration des performances? –

+0

Oui, le temps de chargement a diminué de manière significative. Cependant, il faut encore un peu de temps pour charger des fichiers plus volumineux. –