2010-03-26 16 views
9

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?

MSCharts Level Chart

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!

Odpowiedz

5

Użyj innych metod wiązania, są one bardzo szybkie.

Aktualizuję około 15 serii na 3 obszarach, z 300 punktami w każdej serii, co sekundę i bez rzeczywistego spowolnienia.

+0

Dzięki, sprawdzę to. – Marcel

+1

To działa ponad dwa razy szybciej. Dodałem źródło do pytania. – Marcel

+0

@Marcel: Właściwie miałem na myśli te metody BindXY, ale myślę, że Punkty są takie same. – leppie

Powiązane problemy