2010-01-13 22 views
6

Una aplicación en la que nuestra empresa está trabajando actualmente muestra muchas formas rectangulares con degradados para dibujar 'Azulejos'. Se produjo una discusión interna que planteó una cuestión de rendimiento. Estas fichas tienen aproximadamente 100 píxeles por 200 píxeles y están sombreadas en rojo, amarillo o verde. En cualquier momento dado, podría haber hasta 100 de estos mosaicos en la pantalla. ¿Sería más adecuado para nosotros crear una imagen para cada uno (rojo, amarillo, verde) y repetirla cuando sea necesario, o sería mejor para nosotros seguir dibujando con los pinceles estándar de WPF?¿Se obtienen muchas imágenes repetidas de mayor o menor rendimiento que el uso de pinceles en WPF?

EDITAR: Para aclarar, el pincel de degradado que estamos utilizando es un LinearGradientBrush.

+0

¿Con qué medida de rendimiento están más preocupados? Velocidad, uso de memoria, uso de la CPU, etc. –

+0

Rendimiento de gráficos, utilización de la CPU, etc. Cuando me desplazo por una lista de cientos de tales mosaicos de degradado, presencio el parpadeo de la pantalla y la alta utilización de la CPU. Hemos intentado algunas cosas para ayudar al rendimiento, pero sin suerte. Me preguntaba si usar imágenes rasterizadas sería de ayuda. – Kilhoffer

+0

¿Parpadeo y alta utilización de CPU para solo unos cientos de estos mosaicos? ¿Qué tipo de objetos estás creando para las fichas? ¿Está creando FrameworkElements o UIElements completos o está trabajando con la clase Visual de nivel inferior? – Charlie

Respuesta

1

Por experiencia, dibujarlos usando cepillos tendrá un mejor rendimiento. La sobrecarga de cargar las imágenes de mosaico y representarlas es grande en comparación con la representación de los rectángulos llenos.

+0

¿Puede decirme las razones técnicas de por qué los cepillos de gradiente tienen mejor rendimiento? Si es así, la recompensa es toda tuya. – Kilhoffer

+0

Las razones técnicas son bastante básicas. IO es siempre una de las operaciones más costosas que puede hacer. Leer imágenes de archivos llevará tiempo; renderizar algo sin esa sobrecarga va a tomar menos tiempo. Una vez que aciertes el código de renderizado real, se reducirá a lo mismo (DirectX altamente optimizado), pero la diferencia es que el enfoque de pincel no tiene ningún sobrecarga para crear la imagen. – Charlie

+0

Disculpa, debería haber mencionado esto en mi publicación. Voy a editar en consecuencia. Solo hay 3 imágenes que se repetirían. El único IO los está leyendo por primera vez. Después de eso, son recursos almacenados en caché. – Kilhoffer

1

La única manera de aclarar esto sería probarlo en ambos sentidos y medir el rendimiento de cada enfoque.

Tendrá que agregar código para cronometrar el bucle de renderizado y registrar el resultado en un archivo, luego forzar un mil (o incluso 100.000) redibujados para poder obtener una figura realista.

Mi intuición es que el LinearGradientBrush sería más rápido que cargar una imagen (incluso con recursos), pero estoy dispuesto a demostrar que está equivocado.

Cuestiones relacionadas