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 (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.
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.
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.
// 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
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.
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í.
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ší.
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.
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.
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í.
// 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;
}
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žim | Popis | Zpoždění |
|---|---|---|
| FIFO | Klasický VSync s čekáním na VBlank | 1 snímek |
| Mailbox | Trojité bufferování, vyhazování starých snímků | 1–2 snímky |
| Immediate | Bez synchronizace, maximální FPS | 0 snímků |
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.
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
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.
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.
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.
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í.
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í
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í.
Přečtěte si také