Hola otra vez.
He estado probando el asunto del doble buffer para realizar una animación,
pero me sigue parpadeando la pantalla (bastante menos, pero parpadea,
incluso cuando invalido sólo el área de la animación).
El mapa de bits ocupa 400x400 píxeles (de los cuales animo un rectángulo de
unos 40x400), no creo que sea un tamaño excesivo para que todo parpadee...
sobre todo viendo a otros programas que van de muerte...
Ya sé que tengo la opción del directx, pero lo veo como matar moscas a
cañonazos...
El código encargado de componer el mapa de bits es:
m_gameAnimatrix++;
if(m_gameAnimatrix>15)
m_gameAnimatrix=0;
m_dblBuffGraphic=Graphics.FromImage(m_dblBuffBitmap);
for(int i=0;i<m_config.HorzBalls;i++)
for(int j=0;j<m_config.VertBalls;j++)
{
Rectangle r=new Rectangle(m_gameAnimatrix*40,m_gameMatrix[i,j]*40,40,40);
m_dblBuffGraphic.DrawImage(m_bitmap,i*40,j*40,r,GraphicsUnit.Pixel);
}
m_dblBuffGraphic.Dispose();
m_pnlGame.Invalidate(false);
Luego, en el método de pintado, ejecuto:
if(m_gameStarted)
e.Graphics.DrawImage(m_dblBuffBitmap,0,0);
EL código real está dentro de los dos for, que componen una tesela de 10x10
mapas de bits dependiendo del índice de m_gameAnimatrix. m_bitmap contiene
los frames de las animaciones, de modo que es de ahí de donde se saca cada
pedazo de bitmap, y m_gameMatrix es la matriz que me indica qué tesela va en
cada sitio.
La cuestión es que el parpadeo sigue apareciendo, pero esta vez en lugar de
ver barrido del pintado, se ve como un molesto parpadeo (al estilo de una
lámpara estroboscópica).
Lo curioso del asunto es que el efecto estroboscópico sigue apareciendo
incluso si se invalida un área de 10x10 pixeles (claro está, efecto aparece
"dentro" de ese área, fuera de ella todo está normal).
Supongo que estoy haciendo algo mal, porque hace tiempo tuve que hacer algo
parecido con el GDI (sin plus y en c++) y no tenía esos efectos tan malos, y
no utilizaba ni doble buffer ni nada, y antes de pintar tenía que hacer un
buen número de operaciones antes de dibujar cada uno de los posibles 256
elementos, en un área de 1600x1200.
Todo avaro tiene un hijo gastador.
**** Powered by zxFortunes:
http://sourceforge.net/projects/zxfortune
Leer las respuestas