Stworzyłem kilka prostych wykresów (typu FastLine) z MSChart i aktualizować je z danymi na żywo, jak poniżej:Jak poprawić wydajność WinForms MSChart?
Aby to zrobić, wiążę zauważalnego kolekcję typu niestandardowego do wykresu tak:
// 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
Przy każdym odświeżeniu zestaw danych całkowicie się zmienia, nie jest to aktualizacja przewijana!
Za pomocą profilera stwierdziłem, że wywołanie DataBind()
trwa około 1,5 sekundy. Pozostałe połączenia są nieistotne.
Jak mogę to przyspieszyć?
- Czy powinienem używać innego typu niż ObservableCollection? Tablica prawdopodobnie?
- Czy należy użyć innej formy powiązania danych?
- Czy jest jakaś poprawka dla MSChart, którą mogłem pominąć?
- Czy powinienem użyć sparowanego zestawu dat, mając tylko jedną wartość na piksel?
- Czy po prostu osiągnąłem limit wydajności MSCharts?
Z rodzaju aplikacji, aby była "płynna", powinniśmy mieć wiele odświeżeń na sekundę.
Dzięki za wszelkie wskazówki!
EDIT: Rozwiązanie zaproponowane przez 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 }
});
}
To działa teraz ponad dwa razy szybciej!
Dzięki, sprawdzę to. – Marcel
To działa ponad dwa razy szybciej. Dodałem źródło do pytania. – Marcel
@Marcel: Właściwie miałem na myśli te metody BindXY, ale myślę, że Punkty są takie same. – leppie