Traduction officieuse du tutorial de Michael
Martak. Dont je n'ai pas trouvé
l'e-mail: si ca dérange quelqu'un, je veux bien enlever
cette traduction.
La version originale est sur
java.sun.com
(et ici un zip contenant la
traduction pour la regarder offline )
Supposons que vous ayez à dessiner une image sur l'écran entier, pixel par pixel ou ligne par ligne. Si vous pensez dessiner celle-ci directement sur l'écran (c'est à dire en utilisant Graphics.drawLine), vous remarquerez probablement avec déception que cela prend beaucoup de temps. Vous verrez même comment votre image est dessinée. Au lieu de dessiner de cette façon et à cette allure, la plupart des programmeurs utilisent une technique appelée double-buffering.
La notion traditionnelle de double-buffering en Java est plutôt simple: créez une image offscreen, dessinez sur cette image en utilisant l'objet graphics de celle-ci, puis d'un seul coup, appelez drawImage en utilisant l'objet graphics de la fenêtre cible et l'image offscreen. Vous aurez peut-être déjà remarquer que Swing utilise cette technique dans de nombreux composants en utilisant, généralement par défaut, la méthode setDoubleBuffered.
On désigne communément la surface de l'écran par surface primaire (primary surface) et l'image offscreen utilisée pour le double-buffering par back buffer. On désigne fréquement le fait de copier le contenu d'une surface sur une autre par Block Line Transfer ou blitting (car BLT est prononcé blit).
La surface primaire est habituellement manipulée à travers l'objet graphique de n'importe quel composant d'affichage; en mode plein écran, toute opération utilisant le graphics de la fenêtre en plein écran est une manipulation directe de la mémoire de l'écran (bof comme traduction). Pour cette raison, vous pouvez tirer parti des autres capacités du mode plein écran qui seraient restées autrement indisponibles à cause du sur-traitement du système de fenêtrage. Un exemple de technique qui n'est disponible qu'en mode plein écran est une sorte de double-buffering appelé page-flipping.
De nombreuses cartes graphiques possèdent la notion de pointeur vidéo (video pointer), qui est simplement une adresse dans la mémoire vidéo. Ce pointeur dit aux cartes graphiques où chercher le contenu qui doit être affiché pendant le prochain rafraichissement. Dans certaines cartes graphiques et sur certains OS, ce pointeur peut même être manipulé par le programmeur. Supposons que vous ayez créé un back buffer (dans la mémoire video) ayant exactement la largeur, la taille, la profondeur de bit de l'écran, alors dessinez dans ce buffer de la façon analogue au double-buffering. Maintenant, imaginez ce qui se passerait si, au lieu de « blitter » votre image sur l'écran, vous changiez simplement le pointeur video sur votre back buffer. Lors du rafraichissement suivant, la carte graphique afficherait votre image. Ce changement est appelé page-flipping, et le gain de performance sur un blt-based double-buffering est que seul un pointeur a besoin d'être changé dans la mémoire au lieu de copier le contenu entier d'un buffer vers un autre.
Quand un page flip a lieu, le pointer sur l'ancien back buffer pointe alors vers la surface primaire et le pointeur sur l'ancienne surface primaire pointe alors sur la mémoire du back buffer. This sets you up automatically for the next draw operation.
Quelquefois, il est avantageux de fixer plusieurs back buffers dans une flip chain. C'est particulièrement utile quand le temps passé à dessiner est plus grand que le taux de rafraichissement du moniteur. Une flip chain, c'est simplement deux ou trois back buffers (quelquefois appelés intermediary buffers) ainsi qu'une surface primaire (ceci est appelé triple-buffering, quadruple-buffering, etc.). Dans une flip chain, le prochain back buffer disponible devient la surface primaire, etc... all the way down to the rearmost back buffer that is used for drawing.
Si votre critère de performance est simplement la vitesse à laquelle ont lieu le double-buffering ou le page-flipping par rapport ou rendu direct, vous serez déçus. Vous trouverez que vos statistiques pour le rendu direct excède de loin celles du double-buffering et que celle-ci dépassent de loin celles du page-flipping. Chacune de ces techniques est utilisée pour améliorer la performance perçue (perceived performance), qui est vraiment plus importante dans les applications graphiquesque la performance numérique (numerical performance).
Le Double-Buffering est d'abord utilisé pour éliminer les dessins visibles (visible draws ) qui donne un air amateur à une application où alors donne l'impression quelle clignote. La page-flipping est utilisé avant tout pour éliminer le tearing, qui se produit lorsque le dessin à l'écran est plus rapide que le taux de rafraichissement du moniteur. Un affichage lisse,doux (smooth) signifie de de mailleurs performances perçues et une meilleur impression de l'utilisateur.