2010-03-26 24 views
9

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?

MSCharts Level Chart

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!

risposta

5

Utilizzare gli altri metodi Bind, sono molto veloci.

Aggiornamento circa 15 serie su 3 aree, con 300 punti in ogni serie, ogni secondo e nessun rallentamento reale.

+0

Grazie, controllerò questo. – Marcel

+1

Questo funziona più del doppio per me. Ho aggiunto la fonte alla domanda. – Marcel

+0

@ Marcel: In realtà intendevo quei metodi BindXY, ma credo che i Punti siano gli stessi. – leppie

Problemi correlati