VSync (Vertical Synchronization) — technológia, amely szinkronizálja a GPU minden új képkockájának megjelenítését a kijelző frissítési gyakoriságával, megszüntetve a kép szakadását. A Apple Metal Documentation szerint a VBlank-kel történő szinkronizáció kötelező a sima rendereléshez mobileszközökön. Screen tearing akkor keletkezik, amikor a képkocka a függőleges letapogatás közben frissül, és a VSync megakadályozza ezt a keveredést.
Főbb pontok
VSync (Vertical Synchronization) — hardver-szoftver mechanizmus, amely arra kényszeríti a GPU-t, hogy várjon a függőleges kioltási jelre (VBlank) az új képkocka megjelenítése előtt. VSync nélkül a GPU bármikor küldhet képkockákat, még akkor is, amikor a kijelző éppen az aktuális képkockát rendereli, ami a kép vízszintes vonal mentén történő szakadásához vezet.
Mobileszközökön a VSync a grafikus illesztőprogram és az operációs rendszer szintjén van megvalósítva. Az iOS a VBlank szinkronizációt a Metalon keresztül használja, az Android pedig a SurfaceFlingeren és BufferQueue-on keresztül. Bekapcsolt függőleges szinkronizáció esetén az alkalmazás FPS-e nem haladhatja meg a kijelző frissítési gyakoriságát — 60, 90 vagy 120 Hz-et a készülék modelljétől függően.
A függőleges szinkronizáció kifejezés a CRT monitorok működési mechanizmusából származik, ahol az elektronsugár sorról sorra rajzolta a képet felülről lefelé. A képkocka befejezése után a sugár visszatért a bal felső sarokba — ezt a pillanatot függőleges kioltásnak nevezték. A modern LCD és OLED kijelzők megtartották ezt a kifejezést, bár fizikailag másképp működnek.
GPU a back bufferbe rendereli a képkockákat, a kijelző pedig a front bufferből olvas. A VSync garantálja, hogy a pufferek cseréje (swap) csak a VBlank pillanatában történik — amikor a kijelző befejezte az aktuális képkocka megjelenítését és készen áll a következőre. Ezt a mechanizmust kettős pufferelésnek nevezik VBlank-en keresztüli szinkronizációval.
Kettős pufferelés két puffert használ: front buffert, amely a képernyőn jelenik meg, és back buffert, amelybe a GPU az aktuális képkockát írja. Amikor a képkocka elkészült, a pufferek helyet cserélnek. Bekapcsolt VSync esetén ez a csere a legközelebbi VBlank-ig késik. A GPU tétlen marad, ha a képkocka korábban készül el, mint a VBlank, ami csökkenti a teljesítményt, de megszünteti a tearing-et.
// OpenGL — VSync bekapcsolása WGL_EXT_swap_control segítségével
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync bekapcsolva, 0 = kikapcsolva
VBlank — rövid időintervallum az aktuális képkocka utolsó sora és a következő képkocka első sora között. Ebben a pillanatban a kijelző nem frissíti a pixeleket, és a pufferek cseréje artefaktumok nélkül történik. A VBlank időtartama a frissítési gyakoriságtól függ: 60 Hz-en egy 1080p-s kijelzőn a VBlank körülbelül 1.4 ms ideig tart. Ha a GPU nem tudja befejezni a renderelést a VBlank előtt, a képkocka kimarad, és a kijelző az előző képkockát mutatja még egy cikluson keresztül — ezt akadozásként (stutter) érzékeljük.
Háromszoros pufferelés megoldja a GPU tétlenségének problémáját egy harmadik puffer hozzáadásával. A GPU azonnal elkezdheti a következő képkocka renderelését, még akkor is, ha az egyik back buffer VBlank-re vár. Ez növeli az FPS-t VSync esetén, de egy plusz képkocka késleltetést ad hozzá. Mobileszközökön a háromszoros pufferelést néhány játékmotorban és a Vulkanban használják Mailbox módban.
Kikapcsolt VSync maximális FPS-t és minimális input lag-ot biztosít, de vizuális artefaktumok árán. Mobil játékok és sima animációjú alkalmazások esetében a VSync és annak kikapcsolása közötti választás kompromisszum a kép élessége és a vezérlés reagálóképessége között.
Screen tearing — vízszintes szakadás, ahol a képernyő felső része az előző képkockát mutatja, az alsó része pedig már a következőt. Ez akkor történik, amikor a GPU a puffereket a kijelző letapogatási ciklusának közepén cseréli. Mobileszközökön a tearing különösen észrevehető gyors görgetéskor vagy dinamikus jelenetekben magas képkockaszám mellett. OLED kijelzők azonnali válaszidejükkel kontrasztosabbá teszik a tearing-et az LCD-hez képest.
A tearing intenzitása az FPS és a frissítési gyakoriság arányától függ. 60 FPS-nél egy 60 Hz-es képernyőn a tearing egy statikus vonalként jelenik meg, 300 FPS-nél 60 Hz-en pedig többszörös hullámzó szakadásként, amelyek felülről lefelé mozognak. Minél magasabb az FPS a frissítési gyakorisághoz képest, annál több szakadás és annál észrevehetőbbek.
Input lag VSync esetén — a gombnyomás és az eredmény képernyőn való megjelenése közötti késleltetés. A függőleges szinkronizáció átlagosan egy képkocka késleltetést ad hozzá (16.7 ms 60 Hz-en), háromszoros pufferelés esetén pedig akár két képkockát. Az alkalmi alkalmazásoknál ez a késleltetés észrevehetetlen, de lövöldözős játékoknál, verekedős játékoknál és ritmusjátékoknál kritikus: a profik még 8 ms késleltetést is észrevesznek.
A NVIDIA (2024) kutatása szerint az átlagos input lag a CS:GO-ban 60 FPS-nél VSync nélkül 22 ms, VSync-kel pedig 39 ms. 144 FPS-nél a különbség 14 vs 18 ms-ra csökken. Mobil platformokon a VSync input lag kevésbé kritikus az érintőképernyős bevitel miatt, ahol a touchscreen hardveres késleltetése (10–30 ms) elfedi a szinkronizáció többletkésleltetését.
A mobilfejlesztésben a VSync-et grafikus API-kon, játékmotorokon és az operációs rendszer rendszerbeállításain keresztül kezelik. Az iOS kevesebb kontrollt biztosít, az Android többet a Vulkan és OpenGL ES segítségével. A mód kiválasztása az alkalmazás típusától függ: játék, UI vagy videó.
Unity a QualitySettings.vSyncCount beállítást használja: 0 — kikapcsolva, 1 — VSync minden VBlank-nél, 2 — minden másodiknál (FPS feleződik). Unreal Engine-ben a VSync-et az r.VSync konzolparancs és a DefaultEngine.ini kezeli. Mobil buildekhez ajánlott a VSync kikapcsolása a Unityben és saját FPS-korlátozó használata, mivel a beépített VSync az Android SurfaceFlingerben kiszámíthatatlan késleltetéseket okozhat.
// Unity — VSync és FPS kezelése
void Awake()
{
// 0 = VSync kikapcsolva, 1 = VSync bekapcsolva
QualitySettings.vSyncCount = 0;
// Saját FPS-korlátozó VSync helyett
Application.targetFrameRate = 60;
}
Vulkan teljes kontrollt biztosít a VkSwapchainPresentInfo és presentMode segítségével: VK_PRESENT_MODE_FIFO_KHR — klasszikus VSync, VK_PRESENT_MODE_MAILBOX_KHR — háromszoros pufferelés várakozás nélkül, VK_PRESENT_MODE_IMMEDIATE_KHR — szinkronizáció nélkül. Metal iOS-ben a VSync-et a CAMetalLayer.displaySyncEnabled segítségével kezeli. iOS 14-től kezdve az Apple a displaySyncEnabled = true alapértelmezett használatát ajánlja minden alkalmazáshoz, kivéve az arkádvezérlésű játékokat.
| Mód | Leírás | Késleltetés |
|---|---|---|
| FIFO | Klasszikus VSync VBlank várakozással | 1 képkocka |
| Mailbox | Háromszoros pufferelés, régi képkockák eldobása | 1–2 képkocka |
| Immediate | Szinkronizáció nélkül, maximális FPS | 0 képkocka |
FPS-korlátozó — alternatíva a VSync helyett, ahol az alkalmazás programozottan korlátozza a képkockasebességet, anélkül, hogy VBlank-re várna. Ez a megközelítés kiszámítható késleltetést biztosít, és nem függ a kijelző frissítési gyakoriságától. Androidon az FPS-korlátozás a Choreographer segítségével, iOS-en a CADisplayLink segítségével történik a megjelenítési idő kézi vezérlésével.
Hagyományos VSync alapvető hátránnyal rendelkezik: a kijelző rögzített frissítési gyakoriságához van kötve. Ha a GPU 45 FPS-t produkál egy 60 Hz-es képernyőn, a VSync nem tud 45 képkockát megjeleníteni — 30-at jelenít meg (minden második VBlank-et kihagyva) vagy 60 és 30 között váltakozik egyenlőtlen időközökkel. Ez akadozást (stutter) hoz létre, ami jobban rontja a játékélményt, mint a tearing.
Adaptive Sync (FreeSync, G-Sync, Apple ProMotion) megoldja ezt a problémát a kijelző frissítési gyakoriságának dinamikus megváltoztatásával az alkalmazás FPS-ének megfelelően. Ha az alkalmazás 47 FPS-t produkál, a kijelző 47 Hz-re vált — minden képkocka pontosan egyszer jelenik meg, szakadás és akadozás nélkül. A ProMotion iOS-ben automatikusan kiválasztja a 24 és 120 Hz közötti frekvenciát, egyensúlyozva a simaság és az energiafogyasztás között.
Mobileszközökön az Adaptive Sync szabvánnyá válik: iPad Pro (2017+) ProMotionnal, Android zászlóshajók LTPO kijelzőkkel (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) támogatják a dinamikus frissítési gyakoriságot 1 és 120 Hz között. A fejlesztő számára ez azt jelenti, hogy a VSync hagyományos értelemben rendszerkezeléssel helyettesítődik — elég beállítani a targetFrameRate-et, és az operációs rendszer maga állítja be a frissítési gyakoriságot a simaság és az akkumulátor-élettartam optimális egyensúlyához.
Gyakran ismételt kérdések
Nem. Dinamikus játékokban (lövöldözős, verekedős játékok) a VSync növeli az input lag-ot jelentős előny nélkül — a tearing mobil OLED képernyőkön kevésbé észrevehető a kijelző kis mérete miatt. Alkalmi játékoknál és UI-nál a VSync javítja a simaság érzékelését.
A VSync csökkenti az energiafogyasztást, mert a GPU nem renderel felesleges képkockákat. Kikapcsolt VSync esetén a GPU maximális frekvencián működik, és minden meg nem jelenített képkocka energiát pazarol és melegíti a készüléket a felhasználó számára nyújtott előny nélkül.
A VSync szinkronizálja a képkockák kimenetét a kijelző VBlank-jével, míg az FPS-korlátozó egyszerűen korlátozza a renderelési frekvenciát az alkalmazás kódjában. Az FPS-korlátozó nem szünteti meg a tearing-et, de kiszámítható késleltetést biztosít a képernyő frissítési gyakoriságához való kötődés nélkül.
Amikor a GPU nem tudja befejezni a képkockát a VBlank előtt, a VBlank kimarad, és a képkocka két frissítési cikluson keresztül jelenik meg. 60 Hz-en ez 30 FPS-t eredményez. A háromszoros pufferelés enyhíti ezt a hatást, lehetővé téve a GPU számára, hogy várakozás nélkül kezdje el a következő képkockát.
Igen. Az iOS ProMotion (iPad Pro, iPhone 13 Pro+) támogatja a 24–120 Hz dinamikus frekvenciát. Az Android LTPO paneleken keresztül támogatja az 1–120 Hz-et. A fejlesztőnek nem kell ezt kézzel kezelnie — a rendszer automatikusan kiválasztja az optimális frekvenciát.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is