2012-01-03 13 views
19

Estoy creando un programa de asignación de WPF que potencialmente cargará y dibujará cientos de archivos en la pantalla en cualquier momento, y un usuario puede querer ampliar y desplazarse por esta pantalla. Algunos de estos tipos de archivos pueden contener miles de puntos, que probablemente estarían conectados como algún tipo de ruta. Otros formatos admitidos incluirán archivos TIFF.Gráficos de alto rendimiento con la capa visual de WPF

¿Es mejor para el rendimiento tener un único DrawingVisual del que se extraigan todos los datos, o debería crear un nuevo DrawingVisual para cada archivo cargado?

Si alguien puede ofrecer algún consejo sobre esto, sería muy apreciado.

+2

Esto suena relacionado, aunque quizás no sea exactamente lo que quiere: [Microsoft Deep Zoom] (http://msdn.microsoft.com/en-us/library/cc645050 (v = vs.95) .aspx) – Ray

Respuesta

32

encontrará muchas preguntas relacionadas sobre Desbordamiento de pila, sin embargo, no todas mencionan que una de las formas de mayor rendimiento para atraer grandes cantidades de datos a la pantalla es usar la API WriteableBitmap. Sugiero echar un vistazo al proyecto de código abierto WriteableBitmapEx en codeplex. Divulgación, he contribuido a esto una vez, pero no es mi biblioteca.

Después de haber experimentado con DrawingVisual, StreamGeometry, OnRender, Canvas, todo esto se cae una vez que tiene que dibujar 1,000+ o más "objetos" en la pantalla. Hay técnicas que se ocupan de la virtualización de un lienzo (hay un million items demo con lienzo virtualizado) pero incluso esto se limita a los ~ 1000 visibles a la vez antes de disminuir la velocidad. WriteableBitmap le permite acceder directamente a un mapa de bits y recurrir a ese (estilo oldskool), lo que significa que puede dibujar decenas de miles de objetos a gran velocidad. Usted es libre de implementar sus propias optimizaciones (multi-threading, nivel de detalle), pero tenga en cuenta que no obtiene muchos lujos con esa API. Literalmente estás haciendo el trabajo tú mismo.

Sin embargo, hay una advertencia. Mientras que WPF usa la CPU para tesselation/GPU para renderizar, WriteableBitmap usará la CPU para todo. Por lo tanto, la tasa de llenado (cantidad de píxeles representados por fotograma) se convierte en el cuello de botella en función de la potencia de la CPU.

En caso de que no se necesite representación de alto rendimiento, sugiero echar un vistazo a SharpDX (DirectX administrado) y la interoperabilidad con WPF. Esto le proporcionará el máximo rendimiento, ya que usará directamente la GPU.

Saludos,

+0

Gracias , esto es interesante. Preferiría utilizar los gráficos WPF si fuera posible, ya que he creado programas GIS con GDI + y preferiría probar algo que esté haciendo uso de la GPU. Cuando dices "objetos", ¿te refieres a objetos visuales, o dirías varias líneas en un solo conteo visual como varios objetos? – Greg

+0

Hola Greg, cuando dije objetos me referí a elementos procesados, ya sea dibujados por GDI, o visuales WPF, etc. Con respecto a la aceleración GPU de wpf, todo ese aumento de rendimiento y más se pierde por diseño y teselación del lado de la CPU. Consulte mi sitio web aquí http://goo.gl/1nCpw para obtener una demostración de lo que puede hacer un enfoque de mapa de bits, y compare con otros componentes similares aquí http://goo.gl/ohLFj con las primitivas de representación de wpf. –

+0

Aquí hay [una pregunta] (http://stackoverflow.com/questions/22599806/speeding-up-an-l-system-renderer-in-c-wpf/22727519?noredirect=1#comment34646163_22727519) donde WriteableBitmapEx hizo mucho más Más rápido. – dharmatech

10

Uso de muchas pequeñas DrawingVisuals con pocos detalles prestados por visual dieron un mejor rendimiento en mi experiencia en comparación con menos DrawingVisuals con más detalles prestados por visual. También descubrí que eliminar todas las imágenes y renderizar nuevas imágenes era más rápido que reutilizar las imágenes existentes cuando era necesario volver a dibujar. Romper cada mapa en una serie de imágenes puede ayudar al rendimiento.

Como con todo lo relacionado con el rendimiento, realizar pruebas de tiempo con sus propios escenarios es la mejor manera de estar seguro.

+1

Esta es una respuesta mejor en el contexto de la pregunta original. –

+0

Gracias Repo Man. –

Cuestiones relacionadas