Double Buffering

- Présentation -

        Aïe, encore un mot avec plein de lettres ! Et en Anglais qui plus est. N'ayez crainte, je suis sûr que beaucoup d'entre vous ont déjà rencontré ce mot lors de la lecture d'un magazine de jeux vidéos. En fait, le double buffering consiste à dessiner une scène en mémoire (par exemple un champ de bataille) puis à copier cette image à l'écran. Cette technique, utilisée pour les jeux, vous semble sans doute assez naze. Pourquoi perdre du temps machine à dessiner puis copier ? En fait, l'avantage de cette méthode est que l'on ne voit pas l'image se tracer. Par conséquent, finis les clignotements des sprites et autres tracasseries !

- Notre projet -

        Bien, imaginons un instant que nous soyons en train de coder un jeu de shoot. Les cibles, apparaissant au hasard, sont des Gifs possédant une couleur transparente. Le problème est que le programme va d'abord dessiner l'image avec sa couleur transparente puis l'affacer, d'où clignotement. Ceci est parfaitement visible dans Shoot It ! (voir Nos Productions-Jeux). Quoiqu'il en soit, voici les codes de double buffering en Java et VB.

- Le code Java -

        Voici le code de double buffering en Java (très proche du pseudo-code, donc facilement adaptable). Pour arriver à nos fins, nous allons créer un nouvel objet Graphics, l'écran lui-même en étant un. Ensuite, nous dessinerons dessus, puis nous le récupérerons sous forme d'image que nous afficherons sur le Graphics principal (l'écran).

import java.awt.Image;
import java.awt.Graphics;

public class Name extends java.applet.Applet
{

...

// Création du Graphics secondaire
Graphics offScreen;
// Et l'image correspondante
Image offScreenImg;

...

public void init()
{
  ...
  // Association de l'image offScreenImg au Graphics offScreen
  offScreenImg = createImage(size().width, size().height);
  offScreen = offScreenImg.getGraphics();
  ...
}

// Maintenant, nous devons surcharger les méthodes de dessin

public void update(Graphics g)
{
  // Effacement de offScreen
  // offScreen.setColor(couleur_du_fond);
  // offScreen.fillRect(0, 0, size().width, size().height);
  paint(g);
}

public void paint(Graphics g)
{
  g.drawImage(offScreenImg, 0, 0, this);
}

// Vous pouvez dessiner sur offScreen

public void run()
{
  ...
  offScreen.drawImage(xwing, pos_x, pos_y, this);
  ...
}

// Voilà !

        Vous pouvez retrouver cette technique dans les applets Swirl et Stars (Star Wars).

- Le code Visual Basic -

        Ce n'est pas vraiment un code complet proposé ici, mais des fragments vous aidant à comprendre le principe.

' Soit offScreen un composant Image situé en dehors
' la zone visible de votre interface

' Dessin
...
offScreen.PaintPicture any_picture, x, y
offScreen.PSet (x2, y2), color
...

' Copie du buffer
' Affichage de offScreen sur le fond de la fenêtre courante
Me.Picture = offScreen.Picture

        C'est encore plus simple qu'en Java. Malheureusement, aucun des sources disponibles en téléchargement ne contient une implémentation du double buffering. Donc à vous de faire...