2009-07-19 5 views
21

Estoy escribiendo el código WPF para mostrar un diagrama en tiempo real que es una línea conectada que contiene aproximadamente 10,000 puntos. Se tarda unos 5 segundos en mostrar una imagen en mi computadora. ¿Alguien tiene una idea para hacerlo más rápido y dentro de 0.5 segundos?¿Cómo dibujar la línea de diez mil puntos con WPF en 0,5 segundos?

class eee : FrameworkElement 
{ 

    public eee() 
    { 
     _children = new VisualCollection(this); 
     Random rand = new Random(); 
     DrawingVisual dv = new DrawingVisual(); 
     using (DrawingContext dx = dv.RenderOpen()) 
     { 
      Pen drawingPen = new Pen(Brushes.Black, 1); 
      double x=rand.Next(300); 
      double y = rand.Next(300); 
      for (double i = 0; i < 1000; i = i + 0.1) 
      { 
       y = 100 + rand.Next(100); 
       dx.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y)); 
       x = y; 
      } 
     } 
     _children.Add(dv); 
    } 
+1

Charles es solo los puntos, si necesita las líneas, use el mismo método, funcionará bien. TIENE que aprovechar el sistema de gráficos retenidos. – RandomNickName42

Respuesta

39

Charles Petzold hace exactamente eso. ¡Es incluso más rápido en mi host (< 0.3 segundos), y el punto es incluso DataBound! ;)

Tamir Khason hace esto también, con líneas y profundiza sobre el rendimiento de estilo de mapa de bits WPF here.

Rico Mariani tiene alguna orientación para gráficos de alto rendimiento en 3D, esencialmente el aprovechamiento de los tipos de valores puede mejorar su rendimiento si está bien pensado.

Jianzhong Zhang ofrece mis nuevos tutoriales sobre este tema, la dispersión 3D trama varias decenas de miles de puntos de datos animados e interactivos.

1

¿Deben seleccionarse las líneas? Puede dibujar líneas en la imagen y luego darla como fuente para controlar la imagen. Dibujará más rápido, pero perderá la capacidad de interactuar con las líneas.

0

¿Has considerado XNA? Usar una tarjeta gráfica acelerará las cosas.

+2

WPF usa aceleración de hardware también. –

+3

Para cualquiera que lea esto, XNA ahora está descontinuado. – Nuzzolilo

2

Supongo que el ejemplo de código es 1) una prueba para probar algo que no es realmente la muestra o 2) una tarea.

intenta reemplazar el OnRender y hacer algo como:

Pen drawingPen = new Pen(Brushes.Black, 1); 

protected override void OnRender(DrawingContext dc) 
{ 
    dc.DrawRectangle(Background, null, new Rect(RenderSize)); 


      double x=rand.Next(300); 
      double y = rand.Next(300); 
      for (double i = 0; i < 1000; i = i + 0.1) 
      { 
       y = 100 + rand.Next(100); 
       dc.DrawLine(drawingPen, new Point(i, x), new Point(i + 1, y)); 
       x = y; 
      } 


} 

o algo con los datos reales, considere si realmente necesita para mostrar todos los puntos en función de la resolución del contexto visual. (Si su escala es 0-10 y está produciendo puntos 0.0001,0,00015 son realmente diferentes en su escala)

+0

El DrawRectangle puede no ser necesario ya que los contenidos fueron (en mi caso) borrados en cada renderizado. – Nuzzolilo

0

Monogame, basado en XNA, está activo. Puede usar su poder para resolver algunas tareas especiales que requieren un gran rendimiento de gráficos e incluso inyectar sus ventanas en la GUI de WPF.

Cuestiones relacionadas