VSync — шта је то, принцип рада и подешавање

Аутор: IT Sectr Објављено: 2026-04-01 Време читања: 8 мин

VSync (Vertical Synchronization) — технологија која синхронизује приказ сваког новог кадра GPU-а са брзином освежавања екрана, уклањајући цепање слике. Према Apple Metal Documentation, синхронизација са VBlank-ом је обавезна за глатко рендеровање на мобилним уређајима. Screen tearing настаје када се кадар ажурира током вертикалног скенирања, а VSync спречава ово мешање.

Главне тачке

  • VSync — механизам синхронизације GPU-а са брзином освежавања екрана кроз чекање на VBlank
  • Screen tearing — видљиво цепање слике када се кадар мења усред скенирања екрана
  • Двоструко баферовање — главни метод имплементације VSync-а са front buffer и back buffer
  • Input lag — нуспојава VSync-а, која повећава кашњење између радње корисника и приказа
  • Адаптивна синхронизација — модерна алтернатива VSync-у, која отклања његове недостатке

Шта је VSync

VSync (Vertical Synchronization) — хардверско-софтверски механизам који приморава GPU да сачека сигнал вертикалног гашења (VBlank) пре приказа новог кадра. Без VSync-а, GPU може слати кадрове у било ком тренутку, чак и када је екран у процесу рендеровања тренутног кадра, што доводи до цепања слике дуж хоризонталне линије.

На мобилним уређајима, VSync је имплементиран на нивоу графичког драјвера и оперативног система. iOS користи VBlank синхронизацију кроз Metal, Android — кроз SurfaceFlinger и BufferQueue. Када је вертикална синхронизација укључена, FPS апликације не може премашити брзину освежавања екрана — 60, 90 или 120 Hz у зависности од модела уређаја.

Термин вертикална синхронизација потиче од механизма рада CRT монитора, где је електронски сноп цртао слику линију по линију од врха до дна. Након завршетка кадра, сноп се враћао у горњи леви угао — овај тренутак се називао вертикалним гашењем. Модерни LCD и OLED екрани су задржали овај термин, иако физички раде другачије.

Како ради вертикална синхронизација

GPU рендерује кадрове у back buffer, а екран чита из front buffer-а. VSync гарантује да се замена бафера (swap) дешава само у тренутку VBlank-а — када је екран завршио приказ тренутног кадра и спреман за следећи. Овај механизам се назива двоструко баферовање са синхронизацијом кроз VBlank.

Механизам двоструког баферовања

Двоструко баферовање користи два бафера: front buffer, приказан на екрану, и back buffer, у који GPU уписује тренутни кадар. Када је кадар спреман, бафери замењују места. Са укљученим VSync-ом, ова замена се одлаже до најближег VBlank-а. GPU мирује ако је кадар спреман пре VBlank-а, што смањује перформансе, али елиминише tearing.

cpp
// OpenGL — укључивање VSync-а кроз WGL_EXT_swap_control
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
    reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
        wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync укључен, 0 = искључен

Време чекања VBlank

VBlank — кратак временски интервал између последње линије тренутног кадра и прве линије следећег. У овом тренутку екран не ажурира пикселе, а замена бафера се дешава без артефаката. Трајање VBlank-а зависи од брзине освежавања: при 60 Hz на 1080p екрану, VBlank траје приближно 1.4 ms. Ако GPU не стигне да заврши рендеровање пре VBlank-а, кадар се прескаче, а екран приказује претходни кадар још један циклус — ово се доживљава као застој (stutter).

Троструко баферовање решава проблем мировања GPU-а додавањем трећег бафера. GPU може одмах почети рендеровање следећег кадра, чак и ако један од back buffer-а чека VBlank. Ово повећава FPS са VSync-ом, али додаје један додатни кадар кашњења. На мобилним уређајима, троструко баферовање се користи у неким моторима игара и у Vulkan-у кроз Mailbox режим.

Главни проблеми без VSync-а

Искључени VSync даје максимални FPS и минимални input lag, али по цену визуелних артефаката. За мобилне игре и апликације са глатким анимацијама, избор између VSync-а и његовог искључивања је компромис између оштрине слике и одзивности управљања.

Цепање слике (Screen Tearing)

Screen tearing — хоризонтално цепање при којем горњи део екрана приказује претходни кадар, а доњи — већ следећи. Ово се дешава када GPU мења бафере усред циклуса скенирања екрана. На мобилним уређајима, tearing је посебно приметан при брзом скроловању или у динамичним сценама са високим FPS-ом. OLED екрани са својим тренутним одзивом чине tearing контрастнијим у поређењу са LCD-ом.

Интензитет tearing-а зависи од односа FPS-а и брзине освежавања. При 60 FPS на 60 Hz екрану, tearing се манифестује као једна статична линија, а при 300 FPS на 60 Hz — као вишеструка таласаста цепања која се крећу одозго надоле. Што је FPS већи у односу на брзину освежавања, више цепања и она су уочљивија.

Кашњење уноса (Input Lag)

Input lag при VSync-у — кашњење између притиска дугмета и приказа резултата на екрану. Вертикална синхронизација додаје у просеку један кадар кашњења (16.7 ms при 60 Hz), а при троструком баферовању — до два кадра. За обичне апликације ово кашњење је неприметно, али за пуцачине, борбене и ритам игре је критично: професионалци примећују чак и кашњење од 8 ms.

Према истраживању NVIDIA (2024), просечни input lag у CS:GO при 60 FPS без VSync-а износи 22 ms, а са VSync-ом — 39 ms. При 144 FPS разлика се смањује на 14 vs 18 ms респективно. На мобилним платформама, input lag VSync-а је мање критичан због додирног уноса, где хардверско кашњење тачскрина (10–30 ms) маскира додатно кашњење синхронизације.

Подешавање VSync-а у мобилном развоју

У мобилном развоју, VSync-ом се управља кроз графичке API-је, моторе игара и системска подешавања ОС-а. iOS пружа мање контроле, Android — више кроз Vulkan и OpenGL ES. Избор режима зависи од типа апликације: игре, UI или видео.

VSync у Unity и Unreal Engine

Unity користи подешавање QualitySettings.vSyncCount: 0 — искључен, 1 — VSync при сваком VBlank-у, 2 — при сваком другом (FPS се преполовљује). У Unreal Engine-у, VSync-ом се управља кроз конзолну команду r.VSync и DefaultEngine.ini. За мобилне компилације препоручује се искључивање VSync-а у Unity-ју и коришћење сопственог FPS лимитера, јер уграђени VSync у Android SurfaceFlinger-у може стварати непредвидива кашњења.

csharp
// Unity — управљање VSync-ом и FPS-ом
void Awake()
{
    // 0 = VSync искључен, 1 = VSync укључен
    QualitySettings.vSyncCount = 0;
    // Сопствени FPS лимитер уместо VSync-а
    Application.targetFrameRate = 60;
}

VSync у Vulkan и Metal

Vulkan даје потпуну контролу кроз VkSwapchainPresentInfo и presentMode: VK_PRESENT_MODE_FIFO_KHR — класични VSync, VK_PRESENT_MODE_MAILBOX_KHR — троструко баферовање без чекања, VK_PRESENT_MODE_IMMEDIATE_KHR — без синхронизације. Metal у iOS-у управља VSync-ом кроз CAMetalLayer.displaySyncEnabled. Од iOS 14, Apple препоручује коришћење displaySyncEnabled = true подразумевано за све апликације осим игара са аркадним управљањем.

РежимОписКашњење
FIFOКласични VSync са чекањем на VBlank1 кадар
MailboxТроструко баферовање, одбацивање старих кадрова1–2 кадра
ImmediateБез синхронизације, максимални FPS0 кадрова

Ограничење FPS-а без VSync-а

FPS лимитер — алтернатива VSync-у при којој апликација програмски ограничава број кадрова у секунди, не чекајући VBlank. Овај приступ даје предвидиво кашњење и не зависи од брзине освежавања екрана. На Android-у, ограничавање FPS-а се реализује кроз Choreographer, на iOS-у — кроз CADisplayLink са ручном контролом времена приказа.

VSync и модерне технологије синхронизације

Традиционални VSync има фундаментални недостатак: везан је за фиксну брзину освежавања екрана. Ако GPU производи 45 FPS на 60 Hz екрану, VSync не може приказати 45 кадрова — приказује 30 (прескачући сваки други VBlank) или наизменично 60 и 30 са неједнаким интервалима. Ово ствара застој (stutter), који квари искуство играња више од tearing-а.

Adaptive Sync (FreeSync, G-Sync, Apple ProMotion) решава овај проблем динамичким мењањем брзине освежавања екрана у складу са FPS-ом апликације. Ако апликација производи 47 FPS, екран се пребацује на 47 Hz — сваки кадар се приказује тачно једном, без цепања и застоја. ProMotion у iOS-у аутоматски бира фреквенцију од 24 до 120 Hz, балансирајући глаткоћу и потрошњу енергије.

На мобилним уређајима, Adaptive Sync постаје стандард: iPad Pro (2017+) са ProMotion-ом, Android флагшипови са LTPO екранима (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) подржавају динамичку брзину освежавања од 1 до 120 Hz. За програмера то значи да VSync у традиционалном смислу замењује системско управљање — довољно је подесити targetFrameRate, а ОС ће сам прилагодити брзину освежавања за оптимални баланс глаткоће и трајања батерије.

Често постављана питања

Да ли увек треба укључити VSync у мобилним играма?

Не. У динамичним играма (пуцачине, борбене игре) VSync повећава input lag без значајне користи — tearing на мобилним OLED екранима је мање приметан због мале величине екрана. За обичне игре и UI, VSync побољшава перцепцију глаткоће.

Како VSync утиче на батерију мобилног уређаја?

VSync смањује потрошњу енергије, јер GPU не рендерује непотребне кадрове. Када је VSync искључен, GPU ради на максималној фреквенцији, а сваки неприказани кадар троши енергију и загрева уређај без користи за корисника.

Која је разлика између VSync-а и FPS лимитера?

VSync синхронизује приказ кадрова са VBlank-ом екрана, док FPS лимитер једноставно ограничава брзину рендеровања у коду апликације. FPS лимитер не отклања tearing, али даје предвидиво кашњење без везивања за брзину освежавања екрана.

Зашто FPS може пасти на пола при VSync-у?

Када GPU не стигне да заврши кадар пре VBlank-а, VBlank се прескаче, а кадар се приказује током два циклуса освежавања. На 60 Hz ово даје 30 FPS. Троструко баферовање ублажава овај ефекат, омогућавајући GPU-у да започне следећи кадар без чекања.

Да ли iOS и Android подржавају Adaptive Sync?

Да. iOS ProMotion (iPad Pro, iPhone 13 Pro+) подржава динамичку фреквенцију 24–120 Hz. Android кроз LTPO панеле подржава 1–120 Hz. Програмер не мора ручно да управља овим — систем бира оптималну фреквенцију аутоматски.

Закључак

  • VSync — механизам синхронизације GPU-а са екраном, који елиминише screen tearing
  • Двоструко баферовање са чекањем на VBlank — класична имплементација вертикалне синхронизације
  • Screen tearing — главни проблем искљученог VSync-а, посебно приметан при високом FPS-у
  • Input lag — цена VSync-а, додаје један до два кадра кашњења
  • Троструко баферовање смањује застоје, али повећава input lag
  • Adaptive Sync (ProMotion, LTPO) — модерна замена за VSync са динамичком брзином освежавања
  • За мобилне игре користите FPS лимитер уместо VSync-а за предвидиво кашњење

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође