Animaciones extremadamente lentas (parpadeo en le repintado)

27/01/2005 - 20:04 por Zephryn Xirdal | Informe spam
Hola.

Estoy haciendo un pequeño juego que me anima pequeñas imágenes dentro de la
ventana de la aplicación. He colocado un panel y es ahí, dentro de su
superficie, donde dibujo directamente.

Para ello, cargo un fichero png mediante un Bitmap que contiene las
secuencias de la animación. Luego, mediante un timer, voy invalidando el
área cliente del panel, de modo que en el método OnPaint dibujo el
fotograma. Tengo que pintar 100 objetos cada vez, por lo que en OnPaint
entro en un bucle, y mediante una llamada a DrawImage voy pintando la
animación:

Rectangle r=new Rectangle(frame*40,y*40,40,04);
e.DrawImage(mibitmap,x*40,y*40,r,GraphicsUnit.Pixel);

Como podréis comprobar, cada imagen de la animación tiene 40x40, y en el
mapa de bits están todas las imágenes.

El problema viene que el repintado es extremadamente lento, en el sentido
que toda la pantalla parpadea como una condenada; podría componer el bitmap
y luego sacarlo en lugar de ir pintándolo, o utilizar un buffer doble, o
quizás algún otro método que no se me ha pasado por la cabeza.

¿Me puede decir alguien el método correcto para hacerlo?

Gracias de antemano.


Aplícate tu propio bálsamo. Proclama por doquier tu enfermedad. Eso te
restablecerá. Cuanto más emplees este tratamiento más digno y más sabio te
harás.
**** Powered by zxFortunes: http://sourceforge.net/projects/zxfortune

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral [MVP]
27/01/2005 - 22:41 | Informe spam
Debes usar tecnicas de doble buffer

Este articulo en castellano esta bien, es para VB pero no deberia se dificil
portalo a c#
http://www.elguille.info/colabora/p...rafico.htm

Este esta en C# y en ingles...
http://www.thecodeproject.com/cs/me...rawing.asp


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
#2 Cesarion
28/01/2005 - 13:41 | Informe spam
Viejo lo más recomendable en este caso para que no tengas que hacer todo a
mano es usar alguna tecnología especializada en el manejo de esta clase de
desarrollos, una de ellas es el direct x draw que te permite hacer
exactamente lo que estas pidiendo sin mucho desgaste y sin preocuparte por el
desarrollo por debajo.

"Zephryn Xirdal" escribió:

Hola.

Estoy haciendo un pequeño juego que me anima pequeñas imágenes dentro de la
ventana de la aplicación. He colocado un panel y es ahí, dentro de su
superficie, donde dibujo directamente.

Para ello, cargo un fichero png mediante un Bitmap que contiene las
secuencias de la animación. Luego, mediante un timer, voy invalidando el
área cliente del panel, de modo que en el método OnPaint dibujo el
fotograma. Tengo que pintar 100 objetos cada vez, por lo que en OnPaint
entro en un bucle, y mediante una llamada a DrawImage voy pintando la
animación:

Rectangle r=new Rectangle(frame*40,y*40,40,04);
e.DrawImage(mibitmap,x*40,y*40,r,GraphicsUnit.Pixel);

Como podréis comprobar, cada imagen de la animación tiene 40x40, y en el
mapa de bits están todas las imágenes.

El problema viene que el repintado es extremadamente lento, en el sentido
que toda la pantalla parpadea como una condenada; podría componer el bitmap
y luego sacarlo en lugar de ir pintándolo, o utilizar un buffer doble, o
quizás algún otro método que no se me ha pasado por la cabeza.

¿Me puede decir alguien el método correcto para hacerlo?

Gracias de antemano.


Aplícate tu propio bálsamo. Proclama por doquier tu enfermedad. Eso te
restablecerá. Cuanto más emplees este tratamiento más digno y más sabio te
harás.
**** Powered by zxFortunes: http://sourceforge.net/projects/zxfortune



Respuesta Responder a este mensaje
#3 Zephryn Xirdal
28/01/2005 - 21:55 | Informe spam
Gracias a los dos. Voy a probar el doble buffer.


El que con niños se acuesta, mojado se levanta.
**** Powered by zxFortunes: http://sourceforge.net/projects/zxfortune
"Zephryn Xirdal" escribió en el
mensaje news:
Hola.

Estoy haciendo un pequeño juego que me anima pequeñas imágenes dentro de
la ventana de la aplicación. He colocado un panel y es ahí, dentro de su
superficie, donde dibujo directamente.

Para ello, cargo un fichero png mediante un Bitmap que contiene las
secuencias de la animación. Luego, mediante un timer, voy invalidando el
área cliente del panel, de modo que en el método OnPaint dibujo el
fotograma. Tengo que pintar 100 objetos cada vez, por lo que en OnPaint
entro en un bucle, y mediante una llamada a DrawImage voy pintando la
animación:

Rectangle r=new Rectangle(frame*40,y*40,40,04);
e.DrawImage(mibitmap,x*40,y*40,r,GraphicsUnit.Pixel);

Como podréis comprobar, cada imagen de la animación tiene 40x40, y en el
mapa de bits están todas las imágenes.

El problema viene que el repintado es extremadamente lento, en el sentido
que toda la pantalla parpadea como una condenada; podría componer el
bitmap y luego sacarlo en lugar de ir pintándolo, o utilizar un buffer
doble, o quizás algún otro método que no se me ha pasado por la cabeza.

¿Me puede decir alguien el método correcto para hacerlo?

Gracias de antemano.


Aplícate tu propio bálsamo. Proclama por doquier tu enfermedad. Eso te
restablecerá. Cuanto más emplees este tratamiento más digno y más sabio te
harás.
**** Powered by zxFortunes: http://sourceforge.net/projects/zxfortune

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida