Wie verbessert man Winforms MSchart -Leistung?
-
22-09-2019 - |
Frage
Ich habe einige einfache Diagramme (vom Typ Fastline) mit MSCHART erstellt und sie mit Live -Daten aktualisiert, wie unten:
Dazu binde ich eine beobachtbare Sammlung eines benutzerdefinierten Typs an das Diagramm wie SO:
// 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
Bei jeder Aktualisierung ändert sich der Datensatz komplett, es handelt sich nicht um ein Scroll -Update!
Mit einem Profiler habe ich festgestellt, dass das DataBind()
Der Anruf dauert ungefähr 1,5 Sekunden. Die anderen Anrufe sind vernachlässigbar.
Wie kann ich das schneller machen?
- Sollte ich einen anderen Typ verwenden als die Beobachtungspunkte? Ein Array wahrscheinlich?
- Sollte ich eine andere Form der Datenbindung verwenden?
- Gibt es einige Optimierungen für den MSchart, den ich möglicherweise verpasst habe?
- Sollte ich einen sparsamen Datumssatz verwenden, der nur einen Wert pro Pixel hat?
- Habe ich einfach die Leistungsgrenze von MScharts erreicht?
Von der Art der Anwendung, um sie "fließend" zu halten, sollten wir mehrere Aktualisierungen pro Sekunde haben.
Danke für irgendwelche Hinweise!
Bearbeiten: Lösung, wie von Leppie vorgeschlagen:
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 }
});
}
Dies funktioniert jetzt mehr als doppelt so schnell!
Lösung
Verwenden Sie die anderen Bindungsmethoden, sie sind sehr schnell.
Ich aktualisiere ungefähr 15 Serien über 3 Bereiche, 300 Punkte in jeder Serie, jede Sekunde und keine wirkliche Verlangsamung.