Как улучшить производительность WinForms MSChart? - PullRequest
9 голосов
/ 26 марта 2010

Я создал несколько простых диаграмм (типа FastLine) с помощью MSChart и обновил их живыми данными, как показано ниже:

MSCharts Level Chart

Для этого я привязываю наблюдаемую коллекцию пользовательского типа к диаграмме следующим образом:

                // 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

При каждом обновлении набор данных полностью изменяется, это не обновление с прокруткой!

С помощью профилировщика я обнаружил, что вызов DataBind() занимает около 1,5 секунд. Другие звонки незначительны.

Как я могу сделать это быстрее?

  • Должен ли я использовать другой тип, кроме ObservableCollection? Массив наверное?
  • Должен ли я использовать другую форму привязки данных?
  • Есть ли какой-нибудь твик для MSChart, который я, возможно, пропустил?
  • Должен ли я использовать разреженный набор дат, имеющий только одно значение на пиксель?
  • Я просто достиг предела производительности MSCharts?

В зависимости от типа приложения, чтобы оно было «быстрым», мы должны иметь несколько обновлений в секунду.

Спасибо за любые подсказки!

РЕДАКТИРОВАТЬ: Решение, предложенное Леппи:

                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 }
                    });

            }

Теперь это работает более чем в два раза быстрее!

1 Ответ

5 голосов
/ 26 марта 2010

Используйте другие методы Bind, они очень быстрые.

Я обновляю около 15 серий по 3 областям, по 300 очков в каждой серии, каждую секунду, и никакого реального замедления.

...