Ho creato alcuni semplici grafici (di tipo FastLine) con MSChart e aggiornarli con dati in tempo reale, come di seguito:Come migliorare le prestazioni di WinForms MSChart?
Per farlo, mi legano una raccolta osservabile di un tipo personalizzato al grafico così:
// 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
Ad ogni aggiornamento, il set di dati cambia completamente, non è un aggiornamento a scorrimento!
Con un profiler ho trovato che la chiamata DataBind()
dura circa 1,5 secondi. Le altre chiamate sono trascurabili.
Come posso rendere più veloce?
- Devo utilizzare un altro tipo di ObservableCollection? Un array probabilmente?
- Devo utilizzare un altro tipo di associazione dati?
- C'è qualche ritocco per MSChart che potrei aver perso?
- Devo usare un set di data sparsato, con un solo valore per pixel?
- Ho semplicemente raggiunto il limite di prestazioni di MSCharts?
Dal tipo di applicazione per mantenerlo "fluente", dovremmo avere più aggiornamenti al secondo.
Grazie per eventuali suggerimenti!
EDIT: Soluzione come proposto dal 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 }
});
}
Questo ora lavora più di due volte più veloce!
Grazie, controllerò questo. – Marcel
Questo funziona più del doppio per me. Ho aggiunto la fonte alla domanda. – Marcel
@ Marcel: In realtà intendevo quei metodi BindXY, ma credo che i Punti siano gli stessi. – leppie