lundi 31 décembre 2007

Double buffering en C# CF

Je fais un billet dessus parceque j'ai eu du mal à trouver une des informations rapidement à ce propos.

C'est quoi le double buffering ?
Un méthode de rendu.

A quoi ça sert ?
A résoudre le problème de clignotement de l'écran lorsqu'on redessine tout l'écran (flickering).

Comment on fait ?
On crée une classe qui hérite de PictureBox et on surcharge les méthodes OnPaint() et OnPaintBackground() :

protected override void OnPaint(PaintEventArgs e)
{
Bitmap buffer = new Bitmap(this.Width, this.Height);
Graphics graphics = Graphics.FromImage(buffer);
Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);
PaintEventArgs arg = new PaintEventArgs(graphics, rect);

//paint in the buffer
PaintEverythingInTheBuffer(arg);

//paint on the screen
e.Graphics.DrawImage(buffer, 0, 0);

//clean
graphics.Dispose();
buffer.Dispose();
}

protected override void OnPaintBackground(PaintEventArgs e)
{
//do nothing
}

Voilà, on peut faire plus simple en évitant de créer un PaintEvenArg et en se contentant du Graphics. On peut aussi remplir le buffer dans une fonction appelé avant l'évènement OnPaint() pour ne faire que e.Graphics.DrawImage(buffer, 0, 0); dans l'évènement OnPaint().

Voilà avec ça, adieu les clignotements !

1 commentaire:

bastien a dit…

bonne idée de jeu sur le touch, j'attend la beta...