2012-04-20 14 views
5

Tengo una aplicación que dibuja muchos rectángulos pequeños (aproximadamente 1 millón) usando GDI + en C# y el rendimiento es ... no tan bueno. Entiendo que la construcción de muchos objetos Rectangle para pasarlos al Graphis.FillRectangle lleva algún tiempo. También entiendo que no puedo evitar esto si el Rectangle s cambia de un cuadro a otro, porque Rectangle está diseñado para ser inmutable. Por lo tanto, mi pregunta es: ¿hay alguna posibilidad de mejorar el rendimiento de esta llamada de dibujo, excepto si se supone que todos los Rectangle s están visibles?Dibujando muchos rectángulos en GDI +

Gracias de antemano, Christoph

+0

La creación de instancias de rectángulos no demorará casi nada en comparación con la llamada API real. De hecho, Rectangle es una estructura. – usr

+0

¿Te refieres a 1 mil o 1 millón? –

+0

Es casi seguro que hay una mejor manera. ¿Qué representan los rectángulos? ¿Qué estás tratando de dibujar? –

Respuesta

9

le sugiero que utilice la variante de serie de la llamada en su lugar:

FillRectangles(Brush brush, Rectangle[] rects); 

Si eso no funciona para usted, ya que necesita diferentes cepillos o similares, se debe agrupar las primitivas por estado (pincel) y dibujar las matrices cada una de una sola vez. Una prueba rápida muestra al menos tres veces el rendimiento, es decir, los rectángulos de 300 K dibujados individualmente son tan agitados como los rectángulos de 1M dibujados de una vez.

+1

Eso es realmente mucho más rápido ... – Christoph

+0

FillRectangles es muy lento. ¿Tienes algo más rápido? no es de extrañar que Android haya acelerado en 2d el sistema operativo, porque no es el trabajo de los desarrolladores acelerar el llenado de rectángulos ... en Windows no hay aceleración, y le queda una aplicación con bajo rendimiento. no se preocupe, para el 2050 creo que el hardware para PC debe ser lo suficientemente rápido para la función FillRectangles. Estaré esperando pacientemente. – hamish

+0

usando dotTrace Puedo ver todas las funciones de bajo rendimiento incluso con hardware 2017 aún funciona mal ... incluyen: Rellenar rectángulos, DrawImageUnscaled (GDIPdrawImageI), DrawImage (GdipDrawImageRect) – hamish