2010-03-26 15 views
9

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?

MSCharts Level Chart

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!

Respuesta

5

Utilice los otros métodos de vinculación, son muy rápidos.

Actualizo alrededor de 15 series en 3 áreas, con 300 puntos en cada serie, cada segundo y sin una disminución real.

+0

Gracias, comprobaré esto. – Marcel

+1

Esto funciona más de dos veces más rápido para mí. He agregado la fuente a la pregunta. – Marcel

+0

@Marcel: en realidad me refería a esos métodos BindXY, pero supongo que los puntos son los mismos. – leppie

Cuestiones relacionadas