Buscando una solución más rápida que la GDI para renderizar gráficos de datos dinámicos

StackOverflow https://stackoverflow.com/questions/1074813

Pregunta

He escrito un simple plotter de datos basada en GDI usando C ++ / CLI pero no es especialmente rápido (algunos perfiles básica indica que es la prestación para detectar ese es el problema).

¿Hay alguna manera de activar la aceleración de hardware para un control de usuario o hay una interfaz .NET para Direct3D? ... o hay algunas otras opciones que pude tener en cuenta.

Estamos utilizando código administrado lo que la solución realmente tiene que ser compatible con CLI, si es posible.

[Editar] En caso de que ayuda, estoy rasgando tiras (128 puntos de datos) de los rectángulos que son cada uno de 2x2 píxeles utilizando Graphics::FillRectangle -? Tal vez hay una mejor forma de hacerlo

¿Fue útil?

Solución

Managed DirectX ya no se utiliza durante algún tiempo. Usted realmente no quiere usar eso. En su lugar, debe usar SlimDX que es una capa de interoperabilidad de código abierto para las API DirectX SDK escritas en C ++ / CLI. Es mejor que DirectX Administrado y se apoya en una comunidad de expertos de los desarrolladores. (Voy a estar trabajando en mejorar el apoyo DirectWrite con ellos pronto.)

Otros consejos

A partir de mi experiencia, no obtendrá un buen rendimiento suficiente de utilizar GDI +. Incluso para dibujo simple, se le rápidamente darse cuenta de que hay un montón de gastos.

Alternativas haría (como usted ha mencionado) ser Direct3D, o usted podría considerar GDI con llamadas al sistema. Que, obviamente, hace que la plataforma de código dependiente pero puede ser bastante rápido. He tenido buenos resultados usando eso.

Todo depende de la cantidad de complejidad que está dispuesto a tratar. GDI puede ser relativamente fácil una vez que averiguar lo básico, Direct3D es un poco más compleja. Aunque Direct3D es una prueba más futuro.

Es cierto que GDI + no es muy bueno en cuanto al rendimiento, sin embargo yo mismo he escrito un GDI + lector en un proyecto relacionado con el trabajo que es capaz de escupir gráficos con miles de puntos en ~ 30 fotogramas pr segundo a resolución de 1680x1050 (gráfico desplazamiento).

Me tomó un montón de ajustes para lograr esto:

  • Convertir todo a una sola ruta antes de dibujar.
  • Si se utiliza back-buffer, utilice uno con formato de píxel Format32bppPArgb, esto puede acelerar blitting 2-4x.
  • Si un trazado con un mucho de líneas verticales (señal de alta frecuencia), dibuja como líneas horizontales en el buffer que en vez, y luego dibujar la imagen girada en la pantalla. Tenga en cuenta que la elaboración de una imagen girada también tienen cierto costo.

No puedo ver cómo su escenario requiere una gran cantidad de optimización sin embargo, 128 puntos de datos no es nada. Al poner estos puntos en una GraphicsPath podría hacer una diferencia sin embargo, ya que significaría menos sobrecarga de clasificación.

¿Qué resolución y velocidad de fotogramas estamos hablando aquí, por cierto?

Microsoft ahora también tiene Direct2D , que es acelerada por hardware 2D dibujo:

  

Direct2D es un acelerado por hardware,   inmediata-mode, 2-D API de gráficos que se   proporciona un alto rendimiento y   la prestación de alta calidad para 2-D   geometría, mapas de bits, y el texto. los   API Direct2D está diseñado para   así interoperar con GDI, GDI +, y   Direct3D.

Se requiere Windows 7 / Server 2008 R2, pero el apoyo ha sido retro-añadido a Vista / Server 2008 a través de la actualización de plataforma :

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top