Comment améliorer les performances WinForms MSChart?
-
22-09-2019 - |
Question
J'ai créé quelques graphiques simples (de type FastLine) avec MSChart et les mettre à jour avec les données en direct, comme ci-dessous:
Pour ce faire, je lie une collection observable d'un type personnalisé au tableau comme ceci:
// set chart data source
this._Chart.DataSource = value; //is of type ObservableCollection<SpectrumLevels>
//define x and y value members for each series
this._Chart.Series[0].XValueMember = "Index";
this._Chart.Series[1].XValueMember = "Index";
this._Chart.Series[0].YValueMembers = "Channel0Level";
this._Chart.Series[1].YValueMembers = "Channel1Level";
// bind data to chart
this._Chart.DataBind(); //lasts 1.5 seconds for 8000 points per series
A chaque rafraîchissement, l'ensemble de données change complètement, il n'est pas une mise à jour de défilement!
Avec un profileur j'ai trouvé que l'appel DataBind()
prend environ 1,5 secondes. Les autres appels sont négligeables.
Comment puis-je faire cela plus vite?
- Dois-je utiliser un autre type que ObservableCollection? Un tableau sans doute?
- Dois-je utiliser une autre forme de liaison de données?
- Y at-il tweak pour le MSChart que je l'ai manqué?
- Dois-je utiliser un ensemble sparsed de ce jour, ayant une valeur par pixel seulement?
- Ai-je simplement atteint la limite de performance de MSCharts?
Du type de l'application pour le garder « fluent », nous devrions avoir plusieurs secondes par rafraîchissement.
Merci pour toutes les indications!
EDIT: Solution proposée par leppie:
this._Chart.Series[0].Points.Clear();
foreach (var item in value) //iterates over the list of custom objects
{
this._Chart.Series[0].Points.Add(new DataPoint
{
XValue = item.Index,
YValues = new double[] { item.Channel0Level.Value }
});
}
Cela fonctionne maintenant plus de deux fois plus vite!
La solution
Utilisez les autres méthodes de Bind, ils sont très rapides.
mettre à jour environ 15 séries de 3 zones, avec 300 points dans chaque série, chaque seconde, et pas vraiment ralenti.