
Double Buffering et Page Flipping
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.
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.
Les
avantages du Double-Buffering et du Page-Flipping
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.
