Tuto n°02 : La synchronisation verticale

v07 - 05/2019

Lien de téléchargement direct : Tuto 02 - La synchronisation verticale (PDF)

Introduction

Salut, c’est 3 potes !

Dans ce tuto, nous allons détailler le fonctionnement de la synchronisation verticale. Parce que pour choisir entre V-sync, Fast Sync, G-Sync et Freesync, il faut comprendre un minimum qu’est-c’qui s’passe. Un résumé rapide de tout ça se trouve dans le tuto n°1.

Glossaire et abréviations

  • Back buffer : Mémoire tampon servant à stocker l’image en cours de calcul.
  • CG : Carte graphique.
  • Durian : Fruit originaire d’Asie du sud-est, dont l’odeur est insupportable. Voilà. Je pose ça là.
  • FPS : Frames Per Second. Images par secondes (voir IPS).
  • Frame buffer : Mémoire tampon servant à stocker les images en cours de calcul et celles prêtes à être envoyées à l’écran. C’est l’ensemble formé par les back et front buffer, et éventuellement le third buffer.
  • Front buffer : Mémoire tampon servant à stocker les données de l’image destinée à l’écran.
  • GPU : Graphic Process Unit. C’est (en gros) le processeur graphique de la CG.
  • Input lag : Délai entre une action physique (exemple : clic de souris) et son affichage à l’écran (exemple : tir de fusil). Il dépend exclusivement du matériel et du fonctionnement logiciel du PC, et n’a rien à voir avec le « lag » de ta connexion internet (ou latence réseau).
  • IPS : Images Par Secondes (voir FPS). (OMG UNE BOUCLE INFINIIIIIIIIE)
  • Stuttering : Micro-saccades.
  • Tearing : Déchirement d’image.
  • Third buffer : Troisième buffer servant à stocker l’image en attente de transfert vers le front buffer.
  • VRAM : Video Random Access Memory. La RAM de la carte graphique.

Cas général sans synchronisation

Commençons par quelque chose de commençable : D’où vient l’image du jeu ? (sans rentrer dans les détails, faut pas déconner)

Commençons notre extraordinaire voyage avec la carte graphique, mère de toutes les images, pouponnière de texture et d’ombres, matriarche héroïque des projections polygonales et autres occlusions lumineuses. Dedans se trouve la mémoire vidéo (ou VRAM) qui sert de « frame buffer » (tampon de trame, ou mémoire d’image). Ce frame buffer est dans la majorité des cas divisé en 2 parties virtuellement distinctes ayant des fonctions différentes : back buffer et front buffer.

Schéma des buffers

Le back buffer sert de table de calcul pour le GPU, tandis que les données stockées dans le front buffer sont envoyées à l’écran pour afficher l’image. Pourquoi « virtuellement distinctes » ? Parce que c’est n’est qu’un seul et même composant électronique, seul le logiciel de la carte graphique attribue un rôle arbitraire à telle ou telle partie de la VRAM. D’ailleurs, à certains moments, les back buffer et front buffer « changent de place ». En réalité il ne se passe rien physiquement. C’est simplement le logiciel de la CG qui décide que les cellules mémoires qui endossaient le rôle du back buffer endossent maintenant celui du front buffer. Et inversement.
Dans un monde parfait, l’écran termine d’afficher son image, le front buffer (qui contenait les données destinées à l’écran) se vide, le back buffer (gorgé de données fraichement calculées par le CPU) « prend sa place », ces nouvelles données sont envoyées à l’écran et le GPU peut démarrer le calcul de l’image suivante.
Malheureusement nous ne sommes pas dans un monde parfait. La preuve en est avec ce tuto un peu naze écrit par un auteur vraiment pas ouf.

La plupart des écrans a un taux de rafraichissement fixe : 60Hz, 120Hz, 144Hz, … Un écran 60Hz, par exemple, affichera 60 images par seconde, soit une image toutes les 16,6666667 millisecondes. Cela signifie que le front buffer se vide toujours à la même vitesse. Cependant une carte graphique ne peut pas tenir ce rythme digne d’un coucou suisse. Suivant les scènes, certaines images prennent plus de temps que d’autres à être calculées, et donc le back buffer se remplit plus ou moins vite. On peut considérer deux cas de figure schématisés par cette jolie diapo made in NVIDIA :

Graphe Pas de synchronisation verticale
Crédit image : NVIDIA

1er cas : La carte graphique calcule plus vite ①

Le back buffer (vert) se remplit plus rapidement que le front buffer ne se vide (gris). Tant pis, les buffers sont inversés pour que le GPU puisse calculer une autre image. L’écran n’avait pas fini d’afficher son image et se retrouve avec des données d’une nouvelle image. Il arrête donc au milieu de la première et continue avec la deuxième. Littéralement. La démarcation entre les deux images peut être visible, on appelle cela un déchirement d’image, ou tearing.

2ème cas : La carte graphique calcule plus lentement ②

Le front buffer (gris) se vide plus rapidement que le back buffer (vert) ne se remplit. Contrairement au cas précédent, la carte graphique ne va pas inverser les buffers pour que l’écran affiche une image à moitié calculée. Les buffers restent à leur place et l’écran, n’ayant pas de nouvelles données, réaffiche la même image. On perd en fluidité, et ce phénomène ponctuel s’appelle une micro-saccade, ou stuttering. Ensuite, le GPU peut très bien avoir terminé son calcul, on a inversion des buffers et BIM re-tearing.

Et le tearing, ça ressemble à ça :

Exemple de tearing
Crédit image : hardware.fr

Sur ce screenshot, on voit bien que l’écran a commencé par afficher une image (1), puis en a rapidement reçu une nouvelle (2) et a donc continué avec. Mais il n’a même pas eu le temps de finir de l’afficher que la CG lui en avait expédiée une autre (3) ! Il est perdu le pauvre chou. Je te l’accorde, quand on ne fait pas attention le tearing peut être assez discret pour ne pas se faire remarquer. Mais maintenant tu y feras attention et tu ne le supporteras plus. De rien. Je suis là pour ça.

Là, tu peux te dire « Hey, et si la carte graphique elle attendait que l’écran ait terminé d’afficher son image pour lui en balancer une nouvelle ? ». Et je te répondrais que c’est une magnifique transition pour le point suivant.

Résumé

Pas de synchronisation verticale, ça signifie :

  • Présence de tearing.
  • Présence de stuttering.
  • Input lag minimal.
  • Adapté aux jeux en ligne compétitifs qui demandent de la réactivité. Mais tes yeux souffrent.

V-Sync : la synchronisation verticale de base

Le V-Sync, c’est une solution logicielle au problème de tearing. La carte graphique va laisser l’écran terminer l’affichage de son image avant d’inverser les buffers.

Reprenons nos deux cas précédents avec un petit schéma qui va bien :

Graphe V-Sync
Crédit image : NVIDIA

1er cas : La carte graphique calcule plus vite ①

Le back buffer (vert) se remplit plus rapidement que le front buffer ne se vide (gris). Néanmoins la CG attend sagement que l’écran ait terminé d’afficher son image avant d’inverser les buffers. Magnifique, pas de tearing.

2ème cas : La carte graphique calcule plus lentement ②

Le front buffer (gris) se vide plus rapidement que le back buffer (vert) ne se remplit. L’écran n’a aucun réglage particulier, donc il n’attend pas le GPU et redémarre son cycle avec la même image. Donc stuttering. Le GPU termine son calcul juste après, et on retombe dans le cas 1 mais avec une attente qui peut être beaucoup plus longue. On a alors un retard à l’affichage (ou lag) assez important, qui augmente l’input lag général.

Mais ça l’augmente comment l’input lag ? C’est vraiment handicapant ou est-ce du pinaillage que seuls les pro-gamers à l’œil affuté remarquent ? Eh ben devine quoi, il y a mec assez taré motivé pour mesurer l’input lag dans différentes situations.

Graphe Input lag V-Sync
Crédit image : Blurbusters

Les mesures ont été faites sur Overwatch avec un écran 240Hz bridé à différentes fréquences. On voit par exemple un input lag de 100ms pour un l’écran réglé à 60Hz. Évidemment, les écrans plus rapides (donc vidant leur front buffer plus rapidement) ont des input lag plus faibles avec le V-Sync activé.

Le V-Sync est donc une solution simple au tearing, mais qui montre ses faiblesses lorsque le GPU n’arrive pas à suivre la cadence de l’écran. Cela se traduit par du stuttering et un input lag élevé. On pourrait imaginer diminuer cette faiblesse en réduisant la période d’attente du GPU, lorsque le front buffer n’est pas encore vide. Et c’est ainsi que naquit le triple buffering. Allélouÿa. Enfin peut-être pas…

Résumé

Le V-Sync activé, ça signifie :

  • Absence de tearing.
  • Stuttering plus élevé.
  • Input lag plus élevé.
  • Adapté aux jeux calmes, ou lorsque le tearing se fait trop gênant.

Triple buffering : la rustine du V-Sync

Le triple buffering, ou « tampon triple » dans la langue de Maître Gims, est une solution logicielle qui a pour but de diminuer le stuttering causé par le V-Sync. Son principe est simple : proposer un troisième buffer pour y stocker les données en attente.

Si on reprend nos deux cas avec un schéma tout nouveau tout beau tout chaud :

Graphe Triple buffering
Crédit image : NVIDIA

1er cas : La carte graphique calcule plus vite ①

Le back buffer (vert du haut) se remplit plus rapidement que le front buffer ne se vide (gris). Les données du back buffer passent alors dans le third buffer (vert du milieu) quand celui-ci est disponible, et le GPU peut démarrer un nouveau calcul. Lorsque l’écran a besoin de nouvelles données, il pioche dans le third buffer.

2ème cas : La carte graphique calcule plus lentement ②

Le front buffer (gris) se vide plus rapidement que le back buffer (vert du haut) ne se remplit. L’écran prend alors les données présentes dans le third buffer (vert du milieu). L’image calculée juste après est ensuite stockée dans le third buffer précédemment vidé.

Avec cette nouvelle technique, on réduit fortement le stuttering et son inconfort visuel. Cependant il y a systématiquement une image de décalage, du fait de son stockage dans le third buffer. Cela se traduit en pratique par un input lag beaucoup plus important.

Résumé

La mémoire à triple tampon activée, ça signifie :

  • Absence de tearing (via le V-Sync).
  • Faible stuttering.
  • Input lag encore plus élevé.
  • Adaptée aux jeux calmes, ou ne demandant pas de réactivité particulière.

Fast sync : V-Sync améliorée

Le Fast Sync, c’est une solution logicielle qui n’est dispo que sur les cartes NVIDIA à partir des GTX 9xx. Visuellement, il donne les mêmes résultats que le V-Sync mais en générant un input lag moins important. Je ne sais pas vraiment comment ça fonctionne, mais le gain est réel. La preuve en est avec notre testeur fou :

Graphe Input lag fast sync
Crédit image : Blurbusters

En comparant au graphe du V-Sync, on voit que l’input lag est plus que divisé par deux. Une petite remarque cependant : Plus le nombre de FPS est élevé (et au-dessus de la fréquence maximale de l’écran), moins le Fast sync est sensible au stuttering et à l’input lag. On le voit d’ailleurs entre un jeu à 300 FPS et un jeu à 58 FPS, l’input lag passe de 39 à 51 ms. Pour le stuttering, il va falloir croire notre Buster sur parole.

Résumé

Le Fast Sync peut être utilisé en remplacement du V-Sync avec une carte NVIDIA GTX 9xx et plus récente. Son activation signifie donc :

  • Absence de tearing.
  • Stuttering variable, dépend du nombre de FPS
  • Input lag faible.
  • Adapté aux jeux calmes, ou aux jeux en ligne non joués à haut niveau.

L'adaptative Sync : Le Saint Graal

L’Adaptative Sync, c’est une solution matérielle à tous les problèmes. Sauf la calvitie. Là, faut simplement accepter son sort.
« Adaptative Sync » est le nom générique de la technologie de rafraichissement adaptatif des écrans, et est définie par une norme VESA. Actuellement on en trouve deux déclinaisons commerciales : Freesync pour le système développé par AMD, ou G-Sync pour le système développé par NVIDIA. Dans les deux cas le taux de rafraichissement de l’écran n’est plus fixe, il peut varier dans une certaines fourchette (en général entre 30Hz et la fréquence maximale de l’écran). Finalement, ça fonctionne à l’envers de ce qu’on a pu voir : la CG travaille à l’aveugle, et c’est l’écran qui s’occupe de réguler tout ça.

Promis, c’est la dernière propagande NVIDIA :

Graphe Triple buffering
Crédit image : NVIDIA

L’Adaptative Sync tient tout son intérêt lorsque la CG n’arrive pas à suivre l’écran. Du coup, nos « 1er cas » et « 2ème cas » ont des conséquences un peu différentes.

1er cas : La carte graphique calcule plus vite ①

Le back buffer (vert du haut) se remplit plus rapidement que le front buffer ne se vide (gris). Ça signifie tout simplement que la CG a un nombre de FPS moyen supérieur ou proche de la fréquence maximale de l’écran, et donc que l’Adaptative Sync est inutile. Dans ce cas, ce système miraculeux se désactive. Ce qui devient gênant si les FPS retombent légèrement sous cette fréquence max, puis remontent, puis redescendent, …

2ème cas : La carte graphique calcule plus lentement ②

Le front buffer (gris) se vide plus rapidement que le back buffer (vert du haut) ne se remplit. C’est dans ce cas que l’Adaptative Sync tire son épingle du jeu. Le front buffer se vide, et l’écran ne recommence pas son cycle comme un gros teubé. Il attend patiemment que le back buffer se remplisse et qu’il prenne la place du front buffer. Pas de tearing, pas de stuttering, input lag minimal. Elle est pô belle la vie ?

Le 1er cas peut faire peur, mais il peut être évité assez simplement. En effet, en imposant une limite de FPS légèrement inférieure à la fréquence maximale de l’écran (par exemple à 141-142 FPS pour un écran 144Hz) on parvient à éviter la désactivation de l’Adaptative Sync. Jetons un œil aux mesures de M. Blurbusters :

Graphe Input lag fast sync
Crédit image : Blurbusters

Sur un écran 60Hz avec G-Sync + V-Sync et une limite fixée à 300 FPS, le G-Sync se désactive forcément (avec une bonne CG) et on retrouve l’input lag du V-Sync. Avec une limite à 60 FPS, on ne bouge pas trop. Par contre avec une limite à 59 FPS ça devient intéressant : le G-Sync ne se désactive plus et on retrouve un input lag de 40ms. Remarquons en passant que baisser davantage cette limite ne change presque rien.

Cependant, cette limite ne doit pas être fixée n’importe comment. En faisant quelques tests sur Overwatch, on se rend compte que la limite de FPS in-game génère un input lag beaucoup moins élevé que la limite fixée par le logiciel NVIDIA Inspector. Gad’ moi don’ l’dessin qu’est d’ssous !

Graphe Input lag fast sync
Crédit image : Blurbusters

Ici on a un écran 144Hz dont la limite est fixée à 142 FPS pour garder le G-Sync (et 134 FPS pour vérifier que ça ne change rien). Les mesures ont été faites sur Overwatch avec 3 limiteurs de FPS : le jeu en lui-même, NVIDIA Inspector (NVI) et Riva Tuner Statistics Server (RTSS). On obtient ainsi des input lag de respectivement 23ms, 39ms et 28ms. Donc dans l’idéal, privilégie de limiter tes FPS directement avec le jeu. Au pire, vois avec Riva TSS.

Du coup, Freesync/G-Sync, kécécé la différence ?

G-Sync : la solution NVIDIA

NVIDIA a développé sa propre technologie, qui ne fonctionne qu’avec ses cartes graphiques et qui se veut haut de gamme : le G-Sync. Pour l’exploiter, les fabricants d’écran doivent respecter certaines exigences et intégrer une puce NVIDIA à l’intérieur de l’écran, dont le rôle est de gérer la synchronisation. Deux des principaux points de ces exigences est la fréquence minimale de fonctionnement du G-Sync, de 30Hz, et l’absence de scintillement (Flickering).
Cependant, cela se paie et le surcoût lié à cette technologie n’est pas négligeable (100-150€).

Freesync : La solution AMD

AMD a riposté en sortant le Freesync, une solution qui ne fonctionnait historiquement qu’avec ses cartes graphiques. Point positif, celle-ci est libre de droits et donc quasiment gratuite. L’inconvénient, c’est que les exigences sont beaucoup moins élevées que pour le G-Sync, et il n’est pas rare de croiser des écrans qui ne proposent la Freesync qu’entre 50Hz et 60Hz. Ce qui réduit assez fortement son intérêt. Mais ça n’empêche pas certains écrans Freesync haut de gamme de proposer des performances similaires aux G-Sync.
Le Freesync 2 doit revoir ces exigences à la hausse et les ramener au niveau de celles de NVIDIA, tout en proposant une prise en charge du format HDR. Forcément, les prix des écrans Freesync 2 s’alignent alors sur ceux des écrans G-Sync. Ou pas loin.

Vu que ce choix G-Sync/Freesync est contraignant du point de vue compatibilité, NVIDIA a décidé d’ouvrir le Freesync à ses cartes graphiques. Grâce à une simple mise à jour des pilotes de CG, un écran Freesync peut être rendu « compatible G-Sync ». La qualité de cette compatibilité dépend de l’écran, donc il convient de se renseigner avant de choisir son moniteur.
Pour le moment, les écrans G-Sync ne sont pas compatibles avec les CG AMD. Espérons simplement que dans quelques années tout le monde se sera mis d’accord sur une compatibilité universelle Adaptative Sync VESA…

Conclusion

Allez, j’arrête là et je récapitule, parce que je sens que ton p’tit crâne commence à chauffer. Si néanmoins ton cerveau est watercoolé à l’azote liquide (du coup ce serait nitrocoolé ?), tu peux aller creuser l’excellent article de Blurbuster sur ces technologies. Je n’ai repris que quelques graphes, il reste énormément d’infos dans les explications, et même dans les commentaires de l’article : https://www.blurbusters.com/gsync/gsync101-input-lag-tests-and-settings/

Utilisation Tearing Stuttering Input Lag
Aucune synchro Jeux réactifs Smiley non Smiley bof Smiley oui
V-Sync Jeux calmes ou trop de tearing Smiley oui Smiley non Smiley non
V-Sync + Triple Buffering Jeux calmes Smiley oui Smiley bof Smiley non
Fast Sync* Jeux réactifs non haut niveau Smiley oui Smiley bof Smiley bof
Adaptative Sync** Tous jeux Smiley oui Smiley oui Smiley oui
*Nécessite une carte graphique compatible (GTX 9xx ou plus récente).
**Nécessite un écran compatible et un couple CG+écran compatible.

A toi de choisir ! Même si c’est probable que ce soit plutôt ton porte-monnaie qui choisisse pour toi... Dans tous les cas, n’oublie pas de follow, et on te fera de gros bisous virtuels <3

Exosky pour C3POtes

Les avis/remarques/corrections/ajouts sont les bienvenus. Tu peux nous envoyer un p’tit message sur nos pages de réseaux sociaux et on essaiera de te répondre si on n’est pas trop occupés à se faire spawnkill par la team adverse.

Sources

https://www.blurbusters.com/gsync/gsync101-input-lag-tests-and-settings/
https://www.hardware.fr/articles/914-3/rappel-v-sync-on-off-triple-buffering.html