VSync (Vertical Synchronization) — tehnologie care sincronizează afișarea fiecărui nou cadru GPU cu rata de reîmprospătare a display-ului, eliminând ruperea imaginii. Conform Apple Metal Documentation, sincronizarea cu VBlank este obligatorie pentru randarea lină pe dispozitivele mobile. Screen tearing apare atunci când cadrul este actualizat în timpul baleiajului vertical, iar VSync previne această amestecare.
Principalele puncte
VSync (Vertical Synchronization) — mecanism hardware-software care forțează GPU să aștepte semnalul de ștergere verticală (VBlank) înainte de a afișa un nou cadru. Fără VSync, GPU poate trimite cadre în orice moment, chiar când display-ul este în proces de randare a cadrului curent, ceea ce duce la ruperea imaginii de-a lungul unei linii orizontale.
În dispozitivele mobile, VSync este implementat la nivelul driverului grafic și al sistemului de operare. iOS folosește sincronizarea VBlank prin Metal, Android — prin SurfaceFlinger și BufferQueue. Cu sincronizarea verticală activată, FPS-ul aplicației nu poate depăși rata de reîmprospătare a display-ului — 60, 90 sau 120 Hz în funcție de modelul dispozitivului.
Termenul sincronizare verticală provine de la mecanismul de funcționare al monitoarelor CRT, unde fasciculul electronic desena imaginea linie cu linie de sus în jos. După finalizarea cadrului, fasciculul revenea în colțul din stânga sus — acest moment se numea ștergere verticală. Display-urile moderne LCD și OLED au păstrat acest termen, deși fizic funcționează diferit.
GPU renderizează cadrele în back buffer, iar display-ul citește din front buffer. VSync garantează că schimbarea bufferelor (swap) are loc doar în momentul VBlank — când display-ul a terminat afișarea cadrului curent și este pregătit pentru următorul. Acest mecanism se numește dublă bufferizare cu sincronizare prin VBlank.
Dubla bufferizare folosește două buffere: front buffer, afișat pe ecran, și back buffer, în care GPU scrie cadrul curent. Când cadrul este gata, bufferele își schimbă locurile. Cu VSync activat, această schimbare este amânată până la cel mai apropiat VBlank. GPU rămâne inactiv dacă cadrul este gata înainte de VBlank, ceea ce reduce performanța, dar elimină tearing-ul.
// OpenGL — activarea VSync prin WGL_EXT_swap_control
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync activat, 0 = dezactivat
VBlank — un interval scurt de timp între ultima linie a cadrului curent și prima linie a următorului. În acest moment, display-ul nu actualizează pixelii, iar schimbarea bufferelor are loc fără artefacte. Durata VBlank depinde de rata de reîmprospătare: la 60 Hz pe un display 1080p, VBlank durează aproximativ 1.4 ms. Dacă GPU nu reușește să termine randarea înainte de VBlank, cadrul este omis, iar display-ul arată cadrul anterior pentru un alt ciclu — acest lucru este perceput ca titirez (stutter).
Tripla bufferizare rezolvă problema inactivității GPU prin adăugarea unui al treilea buffer. GPU poate începe randarea următorului cadru imediat, chiar dacă unul dintre back buffer-e așteaptă VBlank. Acest lucru crește FPS-ul cu VSync, dar adaugă un cadru suplimentar de întârziere. Pe dispozitivele mobile, tripla bufferizare este folosită în unele motoare de jocuri și în Vulkan prin modul Mailbox.
VSync dezactivat oferă FPS maxim și input lag minim, dar cu prețul artefactelor vizuale. Pentru jocurile mobile și aplicațiile cu animații line, alegerea între VSync și dezactivarea sa este un compromis între claritatea imaginii și receptivitatea comenzilor.
Screen tearing — o ruptură orizontală în care partea de sus a ecranului arată cadrul anterior, iar partea de jos — deja următorul. Acest lucru se întâmplă când GPU schimbă bufferele în mijlocul ciclului de baleiaj al display-ului. Pe dispozitivele mobile, tearing-ul este deosebit de vizibil la derularea rapidă sau în scenele dinamice cu o rată ridicată a cadrelor. Display-urile OLED cu răspunsul lor instantaneu fac tearing-ul mai contrastant comparativ cu LCD.
Intensitatea tearing-ului depinde de raportul dintre FPS și rata de reîmprospătare. La 60 FPS pe un ecran de 60 Hz, tearing-ul se manifestă ca o singură linie statică, iar la 300 FPS pe 60 Hz — ca multiple rupturi ondulatorii care se mișcă de sus în jos. Cu cât FPS-ul este mai mare față de rata de reîmprospătare, cu atât mai multe rupturi și sunt mai vizibile.
Input lag la VSync — întârzierea între apăsarea unui buton și afișarea rezultatului pe ecran. Sincronizarea verticală adaugă în medie un cadru de întârziere (16.7 ms la 60 Hz), iar la tripla bufferizare — până la două cadre. Pentru aplicațiile casual, această întârziere este imperceptibilă, dar pentru shootere, jocuri de luptă și jocuri ritmice este critică: profesioniștii observă chiar și o întârziere de 8 ms.
Conform cercetării NVIDIA (2024), input lag-ul mediu în CS:GO la 60 FPS fără VSync este de 22 ms, iar cu VSync — 39 ms. La 144 FPS diferența se reduce la 14 vs 18 ms respectiv. Pe platformele mobile, input lag-ul VSync este mai puțin critic datorită intrării tactile, unde întârzierea hardware a touchscreen-ului (10–30 ms) maschează întârzierea suplimentară de sincronizare.
În dezvoltarea mobilă, VSync este gestionat prin API-uri grafice, motoare de jocuri și setări de sistem ale OS. iOS oferă mai puțin control, Android — mai mult prin Vulkan și OpenGL ES. Alegerea modului depinde de tipul aplicației: jocuri, UI sau video.
Unity folosește setarea QualitySettings.vSyncCount: 0 — dezactivat, 1 — VSync la fiecare VBlank, 2 — la fiecare al doilea (FPS scade la jumătate). În Unreal Engine, VSync este gestionat prin comanda consolă r.VSync și DefaultEngine.ini. Pentru compilările mobile, se recomandă dezactivarea VSync în Unity și utilizarea unui limitator propriu de FPS, deoarece VSync-ul încorporat în Android SurfaceFlinger poate crea întârzieri imprevizibile.
// Unity — gestionarea VSync și FPS
void Awake()
{
// 0 = VSync dezactivat, 1 = VSync activat
QualitySettings.vSyncCount = 0;
// Limitator propriu de FPS în loc de VSync
Application.targetFrameRate = 60;
}
Vulkan oferă control complet prin VkSwapchainPresentInfo și presentMode: VK_PRESENT_MODE_FIFO_KHR — VSync clasic, VK_PRESENT_MODE_MAILBOX_KHR — triplă bufferizare fără așteptare, VK_PRESENT_MODE_IMMEDIATE_KHR — fără sincronizare. Metal în iOS gestionează VSync prin CAMetalLayer.displaySyncEnabled. Începând cu iOS 14, Apple recomandă utilizarea displaySyncEnabled = true implicit pentru toate aplicațiile, cu excepția jocurilor cu control arcadă.
| Mod | Descriere | Întârziere |
|---|---|---|
| FIFO | VSync clasic cu așteptare VBlank | 1 cadru |
| Mailbox | Triplă bufferizare, eliminarea cadrelor vechi | 1–2 cadre |
| Immediate | Fără sincronizare, FPS maxim | 0 cadre |
Limitatorul de FPS — o alternativă la VSync, în care aplicația limitează rata cadrelor programatic, fără a aștepta VBlank. Această abordare oferă o întârziere previzibilă și nu depinde de rata de reîmprospătare a display-ului. Pe Android, limitarea FPS se realizează prin Choreographer, pe iOS — prin CADisplayLink cu control manual al timpului de afișare.
VSync tradițional are un dezavantaj fundamental: este legat de o rată fixă de reîmprospătare a display-ului. Dacă GPU produce 45 FPS pe un ecran de 60 Hz, VSync nu poate afișa 45 de cadre — afișează 30 (omind fiecare al doilea VBlank) sau alternează între 60 și 30 cu intervale inegale. Acest lucru creează titirez (stutter), care strică experiența de joc mai mult decât tearing-ul.
Adaptive Sync (FreeSync, G-Sync, Apple ProMotion) rezolvă această problemă prin modificarea dinamică a ratei de reîmprospătare a display-ului în funcție de FPS-ul aplicației. Dacă aplicația produce 47 FPS, display-ul comută la 47 Hz — fiecare cadru este afișat exact o dată, fără rupturi și titirez. ProMotion în iOS selectează automat frecvența de la 24 la 120 Hz, echilibrând finețea și consumul de energie.
Pe dispozitivele mobile, Adaptive Sync devine standard: iPad Pro (2017+) cu ProMotion, flagship-urile Android cu display-uri LTPO (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) suportă rata dinamică de reîmprospătare de la 1 la 120 Hz. Pentru dezvoltator, aceasta înseamnă că VSync în sens tradițional este înlocuit de gestionarea sistemului — este suficient să setezi targetFrameRate, iar OS va ajusta singur rata de reîmprospătare pentru un echilibru optim între finețe și durata bateriei.
Întrebări frecvente
Nu. În jocurile dinamice (shootere, jocuri de luptă) VSync mărește input lag-ul fără un beneficiu semnificativ — tearing-ul pe ecranele OLED mobile este mai puțin vizibil datorită dimensiunii mici a display-ului. Pentru jocurile casual și UI, VSync îmbunătățește percepția fineții.
VSync reduce consumul de energie, deoarece GPU nu renderizează cadre inutile. Cu VSync dezactivat, GPU funcționează la frecvența maximă, iar fiecare cadru neafișat consumă energie și încălzește dispozitivul fără beneficiu pentru utilizator.
VSync sincronizează ieșirea cadrelor cu VBlank-ul display-ului, în timp ce limitatorul de FPS pur și simplu limitează rata de randare în codul aplicației. Limitatorul de FPS nu elimină tearing-ul, dar oferă o întârziere previzibilă fără legătura cu rata de reîmprospătare a ecranului.
Când GPU nu reușește să finalizeze cadrul înainte de VBlank, VBlank-ul este omis, iar cadrul este afișat timp de două cicluri de reîmprospătare. La 60 Hz, aceasta dă 30 FPS. Tripla bufferizare atenuează acest efect, permițând GPU să înceapă următorul cadru fără așteptare.
Da. iOS ProMotion (iPad Pro, iPhone 13 Pro+) suportă frecvența dinamică 24–120 Hz. Android prin panourile LTPO suportă 1–120 Hz. Dezvoltatorul nu trebuie să gestioneze manual acest lucru — sistemul alege frecvența optimă automat.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și