He creado algunos gráficos simples (de tipo FastLine) con MSChart y actualizarlos con datos en tiempo real, como a continuación:¿Cómo mejorar el rendimiento de WinForms MSChart?
Para ello, Ato una colección observable de un tipo personalizado a la tabla como ese:
// 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
En cada actualización, el conjunto de datos cambia completamente, ¡no es una actualización de desplazamiento!
Con un generador de perfiles he encontrado que la llamada DataBind()
tarda unos 1,5 segundos. Las otras llamadas son insignificantes.
¿Cómo puedo hacer esto más rápido?
- ¿Debo utilizar otro tipo que ObservableCollection? Una matriz probablemente?
- ¿Debo usar otra forma de enlace de datos?
- ¿Hay alguna modificación para MSChart que pueda haber pasado por alto?
- ¿Debo usar un conjunto de fechas espaciadas, teniendo solo un valor por píxel?
- ¿Acabo de alcanzar el límite de rendimiento de MSCharts?
Desde el tipo de aplicación para mantenerla "fluida", deberíamos tener varias actualizaciones por segundo.
¡Gracias por cualquier pista!
EDIT: Solución según lo propuesto por 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 }
});
}
Esto ahora trabaja más de dos veces más rápido!
Gracias, comprobaré esto. – Marcel
Esto funciona más de dos veces más rápido para mí. He agregado la fuente a la pregunta. – Marcel
@Marcel: en realidad me refería a esos métodos BindXY, pero supongo que los puntos son los mismos. – leppie