VSync (Vertical Synchronization) est une technologie qui synchronise la sortie de chaque nouvelle image du GPU avec la fréquence de rafraîchissement de l'écran, éliminant ainsi les déchirures d'image. Selon Apple Metal Documentation, la synchronisation avec VBlank est obligatoire pour un rendu fluide sur les appareils mobiles. Screen tearing se produit lorsqu'une image est mise à jour pendant le balayage vertical, et VSync empêche ce mélange.
Points clés
VSync (Vertical Synchronization) est un mécanisme matériel-logiciel qui force le GPU à attendre le signal de blanking vertical (VBlank) avant d'afficher une nouvelle image. Sans VSync, le GPU peut envoyer des images à tout moment, même lorsque l'écran est en train de dessiner l'image actuelle, provoquant une déchirure d'image le long d'une ligne horizontale.
Sur les appareils mobiles, VSync est implémenté au niveau du pilote graphique et du système d'exploitation. iOS utilise la synchronisation VBlank via Metal, Android via SurfaceFlinger et BufferQueue. Avec la synchronisation verticale activée, les FPS de l'application ne peuvent pas dépasser la fréquence de rafraîchissement de l'écran — 60, 90 ou 120 Hz selon le modèle de l'appareil.
Le terme de synchronisation verticale provient du principe de fonctionnement des moniteurs CRT, où un faisceau d'électrons dessinait l'image ligne par ligne de haut en bas. Après avoir terminé une image, le faisceau revenait dans le coin supérieur gauche — ce moment était appelé le blanking vertical. Les écrans LCD et OLED modernes ont conservé ce terme, bien qu'ils fonctionnent physiquement différemment.
Le GPU rend les images dans le back buffer, tandis que l'écran lit dans le front buffer. VSync garantit que l'échange de tampons ne se produit que pendant VBlank — lorsque l'écran a fini d'afficher l'image actuelle et est prêt pour la suivante. Ce mécanisme est appelé double buffering avec synchronisation VBlank.
Le double buffering utilise deux tampons : un front buffer affiché à l'écran et un back buffer dans lequel le GPU écrit l'image actuelle. Lorsque l'image est prête, les tampons sont échangés. Avec VSync activé, cet échange est reporté jusqu'au VBlank le plus proche. Le GPU reste inactif si l'image est prête avant VBlank, réduisant les performances mais éliminant le tearing.
// OpenGL — activation de VSync via WGL_EXT_swap_control
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync activé, 0 = désactivé
VBlank est un court intervalle entre la dernière ligne de l'image actuelle et la première ligne de l'image suivante. Pendant ce moment, l'écran ne met pas à jour les pixels et l'échange de tampons se produit sans artefacts. La durée de VBlank dépend de la fréquence de rafraîchissement : à 60 Hz sur un écran 1080p, VBlank dure environ 1,4 ms. Si le GPU ne termine pas le rendu avant VBlank, l'image est sautée et l'écran affiche l'image précédente pendant un cycle supplémentaire — cela est perçu comme du bégaiement.
Le triple buffering résout le problème d'inactivité du GPU en ajoutant un troisième tampon. Le GPU peut commencer à rendre l'image suivante immédiatement même si l'un des back buffers attend VBlank. Cela augmente les FPS avec VSync mais ajoute une image supplémentaire de latence. Sur les appareils mobiles, le triple buffering est utilisé dans certains moteurs de jeu et dans Vulkan via le mode Mailbox.
VSync désactivé offre un FPS maximum et un input lag minimal, mais au prix d'artefacts visuels. Pour les jeux mobiles et les applications avec animation fluide, le choix entre VSync et sa désactivation est un compromis entre la clarté de l'image et la réactivité des commandes.
Screen tearing est une division horizontale où la partie supérieure de l'écran montre l'image précédente et la partie inférieure montre déjà l'image suivante. Cela se produit lorsque le GPU échange les tampons au milieu du balayage. Sur les appareils mobiles, le tearing est particulièrement visible lors du défilement rapide ou dans les scènes dynamiques avec des fréquences d'images élevées. Les écrans OLED avec leur réponse instantanée rendent le tearing plus contrasté par rapport au LCD.
L'intensité du tearing dépend du rapport entre les FPS et la fréquence de rafraîchissement. À 60 FPS sur un écran 60 Hz, le tearing apparaît comme une seule ligne statique, tandis qu'à 300 FPS sur 60 Hz, il apparaît comme de multiples déchirures ondulées se déplaçant de haut en bas. Plus les FPS sont élevés par rapport à la fréquence de rafraîchissement, plus il y a de déchirures et plus elles sont visibles.
L'input lag avec VSync est le délai entre l'appui sur un bouton et l'affichage du résultat à l'écran. La synchronisation verticale ajoute en moyenne une image de latence (16,7 ms à 60 Hz), et avec le triple buffering — jusqu'à deux images. Pour les applications occasionnelles, ce délai est imperceptible, mais pour les shooters, les jeux de combat et les jeux rythmiques, il est critique : les professionnels remarquent des délais même de 8 ms.
Selon une étude de NVIDIA (2024), l'input lag moyen dans CS:GO à 60 FPS sans VSync est de 22 ms, et avec VSync — 39 ms. À 144 FPS, la différence se réduit à 14 contre 18 ms respectivement. Sur les plateformes mobiles, l'input lag du VSync est moins critique en raison de l'entrée tactile, où la latence matérielle de l'écran tactile (10–30 ms) masque le délai supplémentaire de synchronisation.
Dans le développement mobile, VSync est contrôlé via les API graphiques, les moteurs de jeu et les paramètres système de l'OS. iOS offre moins de contrôle, Android en offre plus via Vulkan et OpenGL ES. Le choix du mode dépend du type d'application : jeux, UI ou vidéo.
Unity utilise le paramètre QualitySettings.vSyncCount : 0 — désactivé, 1 — VSync à chaque VBlank, 2 — à chaque deuxième VBlank (FPS réduit de moitié). Dans Unreal Engine, VSync est contrôlé via la commande console r.VSync et DefaultEngine.ini. Pour les builds mobiles, il est recommandé de désactiver VSync dans Unity et d'utiliser un limiteur de FPS personnalisé, car le VSync intégré d'Android SurfaceFlinger peut créer des délais imprévisibles.
// Unity — contrôle de VSync et des FPS
void Awake()
{
// 0 = VSync désactivé, 1 = VSync activé
QualitySettings.vSyncCount = 0;
// Limiteur de FPS personnalisé au lieu de VSync
Application.targetFrameRate = 60;
}
Vulkan offre un contrôle total via VkSwapchainPresentInfo et presentMode : VK_PRESENT_MODE_FIFO_KHR — VSync classique, VK_PRESENT_MODE_MAILBOX_KHR — triple buffering sans attente, VK_PRESENT_MODE_IMMEDIATE_KHR — sans synchronisation. Metal dans iOS contrôle VSync via CAMetalLayer.displaySyncEnabled. Depuis iOS 14, Apple recommande d'utiliser displaySyncEnabled = true par défaut pour toutes les applications sauf les jeux de type arcade.
| Mode | Description | Latence |
|---|---|---|
| FIFO | VSync classique avec attente VBlank | 1 image |
| Mailbox | Triple buffering, suppression des images anciennes | 1–2 images |
| Immediate | Sans synchronisation, FPS maximum | 0 image |
Un limiteur de FPS est une alternative à VSync où l'application limite la fréquence d'images par programmation sans attendre VBlank. Cette approche offre une latence prévisible et ne dépend pas de la fréquence de rafraîchissement de l'écran. Sur Android, la limitation de FPS est implémentée via Choreographer, sur iOS — via CADisplayLink avec contrôle manuel du timing de sortie.
Le VSync traditionnel a un inconvénient fondamental : il est lié à une fréquence de rafraîchissement fixe de l'écran. Si le GPU produit 45 FPS sur un écran 60 Hz, VSync ne peut pas afficher 45 images — il affiche 30 (sautant un VBlank sur deux) ou alterne entre 60 et 30 avec des intervalles irréguliers. Cela crée du bégaiement, qui gâche l'expérience de jeu plus que le tearing.
Adaptive Sync (FreeSync, G-Sync, Apple ProMotion) résout ce problème en modifiant dynamiquement la fréquence de rafraîchissement de l'écran en fonction des FPS de l'application. Si l'application produit 47 FPS, l'écran passe à 47 Hz — chaque image est affichée exactement une fois, sans déchirure ni bégaiement. ProMotion sur iOS sélectionne automatiquement une fréquence de 24 à 120 Hz, équilibrant fluidité et consommation d'énergie.
Sur les appareils mobiles, Adaptive Sync devient la norme : iPad Pro (2017+) avec ProMotion, les flagships Android avec écrans LTPO (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) prennent en charge une fréquence de rafraîchissement dynamique de 1 à 120 Hz. Pour le développeur, cela signifie que VSync au sens traditionnel est remplacé par la gestion système — il suffit de définir targetFrameRate, et l'OS ajuste lui-même la fréquence de rafraîchissement pour l'équilibre optimal entre fluidité et autonomie de la batterie.
Questions fréquentes
Non. Pour les jeux dynamiques (shooters, jeux de combat), VSync augmente l'input lag sans bénéfice significatif — le tearing sur les écrans OLED mobiles est moins perceptible en raison de la petite taille de l'écran. Pour les jeux occasionnels et les UI, VSync améliore la perception de fluidité.
VSync réduit la consommation d'énergie car le GPU ne rend pas d'images inutiles. Lorsque VSync est désactivé, le GPU fonctionne à la fréquence maximale, et chaque image non affichée gaspille de l'énergie et chauffe l'appareil sans bénéfice pour l'utilisateur.
VSync synchronise la sortie des images avec le VBlank de l'écran, tandis qu'un limiteur de FPS limite simplement la fréquence de rendu dans le code de l'application. Le limiteur de FPS n'élimine pas le tearing mais offre une latence prévisible sans être lié à la fréquence de rafraîchissement de l'écran.
Lorsque le GPU ne termine pas une image avant VBlank, le VBlank est sauté et l'image est affichée pendant deux cycles de rafraîchissement. À 60 Hz, cela donne 30 FPS. Le triple buffering atténue cet effet en permettant au GPU de commencer l'image suivante sans attendre.
Oui. iOS ProMotion (iPad Pro, iPhone 13 Pro+) prend en charge une fréquence dynamique de 24–120 Hz. Android via les panneaux LTPO prend en charge 1–120 Hz. Le développeur n'a pas besoin de gérer cela manuellement — le système sélectionne la fréquence optimale automatiquement.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi