Я создал несколько простых диаграмм (типа FastLine) с помощью MSChart и обновил их живыми данными, как показано ниже:
Для этого я привязываю наблюдаемую коллекцию пользовательского типа к диаграмме следующим образом:
// 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 }
});
}
Теперь это работает более чем в два раза быстрее!