VSync — co to je, princip fungování a nastavení

Autor: IT Sectr Publikováno: 2026-04-01 Doba čtení: 8 min

VSync (Vertical Synchronization) — technologie synchronizující výstup každého nového snímku GPU s obnovovací frekvencí displeje, odstraňující trhání obrazu. Podle Apple Metal Documentation je synchronizace s VBlank povinná pro plynulé vykreslování na mobilních zařízeních. Screen tearing vzniká, když je snímek aktualizován během vertikálního rozmítání, a VSync tomuto míšení zabraňuje.

Hlavní body

  • VSync — mechanismus synchronizace GPU s obnovovací frekvencí displeje čekáním na VBlank
  • Screen tearing — viditelné trhání obrazu, když se snímek mění uprostřed rozmítání obrazovky
  • Dvojité bufferování — hlavní metoda implementace VSync s front buffer a back buffer
  • Input lag — vedlejší účinek VSync, zvyšující zpoždění mezi akcí uživatele a zobrazením
  • Adaptivní synchronizace — moderní alternativa k VSync, odstraňující jeho nevýhody

Co je VSync

VSync (Vertical Synchronization) — hardwarově-softwarový mechanismus, který nutí GPU čekat na signál vertikálního zhasínání (VBlank) před zobrazením nového snímku. Bez VSync může GPU odesílat snímky kdykoli, i když displej právě vykresluje aktuální snímek, což vede k trhání obrazu podél horizontální linie.

Na mobilních zařízeních je VSync implementován na úrovni grafického ovladače a operačního systému. iOS používá synchronizaci VBlank přes Metal, Android — přes SurfaceFlinger a BufferQueue. Při zapnuté vertikální synchronizaci nemůže FPS aplikace překročit obnovovací frekvenci displeje — 60, 90 nebo 120 Hz v závislosti na modelu zařízení.

Termín vertikální synchronizace pochází z mechanismu fungování CRT monitorů, kde elektronový paprsek kreslil obraz řádek po řádku shora dolů. Po dokončení snímku se paprsek vracel do levého horního rohu — tento okamžik se nazýval vertikální zhasínání. Moderní LCD a OLED displeje si tento termín zachovaly, i když fyzicky fungují jinak.

Jak funguje vertikální synchronizace

GPU vykresluje snímky do back bufferu a displej čte z front bufferu. VSync zaručuje, že přepínání bufferů (swap) probíhá pouze v okamžiku VBlank — když displej dokončil zobrazení aktuálního snímku a je připraven na další. Tento mechanismus se nazývá dvojité bufferování se synchronizací přes VBlank.

Mechanismus dvojitého bufferování

Dvojité bufferování používá dva buffery: front buffer, zobrazený na obrazovce, a back buffer, do kterého GPU zapisuje aktuální snímek. Když je snímek připraven, buffery si vymění místa. Při zapnutém VSync je toto přepnutí zpožděno do nejbližšího VBlank. GPU je nečinné, pokud je snímek připraven před VBlank, což snižuje výkon, ale eliminuje tearing.

cpp
// OpenGL — zapínání VSync přes WGL_EXT_swap_control
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
    reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
        wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync zapnuto, 0 = vypnuto

Doba čekání na VBlank

VBlank — krátký časový interval mezi posledním řádkem aktuálního snímku a prvním řádkem následujícího. V tomto okamžiku displej neaktualizuje pixely a přepínání bufferů probíhá bez artefaktů. Délka VBlank závisí na obnovovací frekvenci: při 60 Hz na 1080p displeji trvá VBlank přibližně 1.4 ms. Pokud GPU nestihne dokončit vykreslování před VBlank, snímek je přeskočen a displej zobrazí předchozí snímek po další cyklus — to je vnímáno jako zadrhávání (stutter).

Trojité bufferování řeší problém nečinnosti GPU přidáním třetího bufferu. GPU může okamžitě začít vykreslovat další snímek, i když jeden z back bufferů čeká na VBlank. To zvyšuje FPS při VSync, ale přidává jeden snímek zpoždění navíc. Na mobilních zařízeních se trojité bufferování používá v některých herních enginech a ve Vulkanu přes režim Mailbox.

Hlavní problémy bez VSync

Vypnutý VSync poskytuje maximální FPS a minimální input lag, ale za cenu vizuálních artefaktů. Pro mobilní hry a aplikace s plynulou animací je volba mezi VSync a jeho vypnutím kompromisem mezi ostrostí obrazu a odezvou ovládání.

Trhání obrazu (Screen Tearing)

Screen tearing — horizontální trhání, při kterém horní část obrazovky zobrazuje předchozí snímek a spodní část již další. Dochází k tomu, když GPU mění buffery uprostřed cyklu rozmítání displeje. Na mobilních zařízeních je tearing zvláště patrný při rychlém scrollování nebo v dynamických scénách s vysokou snímkovou frekvencí. OLED displeje se svou okamžitou odezvou dělají tearing kontrastnějším ve srovnání s LCD.

Intenzita tearingu závisí na poměru FPS k obnovovací frekvenci. Při 60 FPS na 60 Hz obrazovce se tearing projevuje jako jedna statická linie, při 300 FPS na 60 Hz — jako vícenásobná vlnitá trhání pohybující se shora dolů. Čím vyšší je FPS vzhledem k obnovovací frekvenci, tím více trhání a tím jsou patrnější.

Vstupní zpoždění (Input Lag)

Input lag při VSync — zpoždění mezi stisknutím tlačítka a zobrazením výsledku na obrazovce. Vertikální synchronizace přidává v průměru jeden snímek zpoždění (16.7 ms při 60 Hz), a při trojitém bufferování — až dva snímky. Pro běžné aplikace je toto zpoždění nepostřehnutelné, ale pro střílečky, bojové hry a rytmické hry je kritické: profesionálové zaznamenají i 8 ms zpoždění.

Podle výzkumu NVIDIA (2024) je průměrný input lag v CS:GO při 60 FPS bez VSync 22 ms, s VSync — 39 ms. Při 144 FPS se rozdíl snižuje na 14 vs 18 ms. Na mobilních platformách je input lag VSync méně kritický kvůli dotykovému vstupu, kde hardwarové zpoždění touchscreen (10–30 ms) maskuje dodatečné zpoždění synchronizace.

Nastavení VSync v mobilním vývoji

V mobilním vývoji je VSync spravován přes grafická API, herní enginy a systémová nastavení OS. iOS poskytuje méně kontroly, Android — více přes Vulkan a OpenGL ES. Volba režimu závisí na typu aplikace: hry, UI nebo video.

VSync v Unity a Unreal Engine

Unity používá nastavení QualitySettings.vSyncCount: 0 — vypnuto, 1 — VSync při každém VBlank, 2 — při každém druhém (FPS se sníží na polovinu). V Unreal Engine je VSync spravován přes konzolový příkaz r.VSync a DefaultEngine.ini. Pro mobilní sestavení se doporučuje vypnout VSync v Unity a použít vlastní omezovač FPS, protože vestavěný VSync v Android SurfaceFlinger může vytvářet nepředvídatelná zpoždění.

csharp
// Unity — správa VSync a FPS
void Awake()
{
    // 0 = VSync vypnuto, 1 = VSync zapnuto
    QualitySettings.vSyncCount = 0;
    // Vlastní omezovač FPS místo VSync
    Application.targetFrameRate = 60;
}

VSync ve Vulkan a Metal

Vulkan poskytuje plnou kontrolu přes VkSwapchainPresentInfo a presentMode: VK_PRESENT_MODE_FIFO_KHR — klasický VSync, VK_PRESENT_MODE_MAILBOX_KHR — trojité bufferování bez čekání, VK_PRESENT_MODE_IMMEDIATE_KHR — bez synchronizace. Metal v iOS spravuje VSync přes CAMetalLayer.displaySyncEnabled. Od iOS 14 Apple doporučuje používat displaySyncEnabled = true jako výchozí pro všechny aplikace kromě her s arkádovým ovládáním.

RežimPopisZpoždění
FIFOKlasický VSync s čekáním na VBlank1 snímek
MailboxTrojité bufferování, vyhazování starých snímků1–2 snímky
ImmediateBez synchronizace, maximální FPS0 snímků

Omezování FPS bez VSync

Omezovač FPS — alternativa k VSync, při které aplikace programově omezuje snímkovou frekvenci, aniž by čekala na VBlank. Tento přístup poskytuje předvídatelné zpoždění a nezávisí na obnovovací frekvenci displeje. Na Androidu je omezování FPS implementováno přes Choreographer, na iOS — přes CADisplayLink s ručním řízením času výstupu.

VSync a moderní synchronizační technologie

Tradiční VSync má zásadní nevýhodu: je vázán na pevnou obnovovací frekvenci displeje. Pokud GPU produkuje 45 FPS na 60 Hz obrazovce, VSync nemůže zobrazit 45 snímků — zobrazí 30 (přeskakuje každý druhý VBlank) nebo střídá 60 a 30 s nerovnoměrnými intervaly. To vytváří zadrhávání (stutter), které kazí herní zážitek více než tearing.

Adaptive Sync (FreeSync, G-Sync, Apple ProMotion) řeší tento problém dynamickou změnou obnovovací frekvence displeje podle FPS aplikace. Pokud aplikace produkuje 47 FPS, displej přepne na 47 Hz — každý snímek je zobrazen přesně jednou, bez trhání a zadrhávání. ProMotion v iOS automaticky vybírá frekvenci od 24 do 120 Hz, vyvažuje plynulost a spotřebu energie.

Na mobilních zařízeních se Adaptive Sync stává standardem: iPad Pro (2017+) s ProMotion, vlajkové lodě Androidu s LTPO displeji (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) podporují dynamickou obnovovací frekvenci od 1 do 120 Hz. Pro vývojáře to znamená, že VSync v tradičním smyslu je nahrazen systémovým řízením — stačí nastavit targetFrameRate a OS sám přizpůsobí obnovovací frekvenci pro optimální rovnováhu plynulosti a výdrže baterie.

Často kladené otázky

Je vždy nutné zapínat VSync v mobilních hrách?

Ne. V dynamických hrách (střílečky, bojové hry) VSync zvyšuje input lag bez výrazného přínosu — tearing na mobilních OLED obrazovkách je méně patrný kvůli malé velikosti displeje. Pro běžné hry a UI VSync zlepšuje vnímání plynulosti.

Jak VSync ovlivňuje baterii mobilního zařízení?

VSync snižuje spotřebu energie, protože GPU nevykresluje zbytečné snímky. Při vypnutém VSync pracuje GPU na maximální frekvenci a každý nezobrazený snímek plýtvá energií a zahřívá zařízení bez užitku pro uživatele.

Jaký je rozdíl mezi VSync a omezovačem FPS?

VSync synchronizuje výstup snímků s VBlank displeje, zatímco omezovač FPS jednoduše omezuje frekvenci vykreslování v kódu aplikace. Omezovač FPS neodstraňuje tearing, ale poskytuje předvídatelné zpoždění bez vazby na obnovovací frekvenci obrazovky.

Proč může FPS při VSync klesnout na polovinu?

Když GPU nestihne dokončit snímek před VBlank, VBlank je přeskočen a snímek je zobrazen po dva obnovovací cykly. Při 60 Hz to dává 30 FPS. Trojité bufferování tento efekt zmírňuje tím, že umožňuje GPU začít další snímek bez čekání.

Podporují iOS a Android Adaptive Sync?

Ano. iOS ProMotion (iPad Pro, iPhone 13 Pro+) podporuje dynamickou frekvenci 24–120 Hz. Android přes LTPO panely podporuje 1–120 Hz. Vývojář to nemusí ručně spravovat — systém volí optimální frekvenci automaticky.

Shrnutí

  • VSync — mechanismus synchronizace GPU s displejem, odstraňující screen tearing
  • Dvojité bufferování s čekáním na VBlank — klasická implementace vertikální synchronizace
  • Screen tearing — hlavní problém vypnutého VSync, zvláště patrný při vysokém FPS
  • Input lag — cena za VSync, přidávající jeden až dva snímky zpoždění
  • Trojité bufferování snižuje zadrhávání, ale zvyšuje input lag
  • Adaptive Sync (ProMotion, LTPO) — moderní náhrada VSync s dynamickou obnovovací frekvencí
  • Pro mobilní hry používejte omezovač FPS místo VSync pro předvídatelné zpoždění

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také