VSync (Vertical Synchronization) — технологія, що синхронізує виведення кожного нового кадру GPU з частотою оновлення дисплея, усуваючи розриви зображення. За даними Apple Metal Documentation, синхронізація з VBlank обов'язкова для плавного рендерингу на мобільних пристроях. Screen tearing виникає, коли кадр оновлюється під час вертикальної розгортки, і VSync запобігає цьому змішуванню.
Головне
VSync (Vertical Synchronization) — апаратно-програмний механізм, який змушує GPU чекати сигналу вертикального гасіння (VBlank) перед виведенням нового кадру. Без VSync GPU може надсилати кадри в будь-який момент, навіть коли дисплей знаходиться в процесі відмальовування поточного кадру, що призводить до розриву зображення по горизонтальній лінії.
На мобільних пристроях VSync реалізовано на рівні графічного драйвера та операційної системи. iOS використовує синхронізацію VBlank через Metal, Android — через SurfaceFlinger і BufferQueue. При увімкненій вертикальній синхронізації FPS додатка не може перевищувати частоту оновлення дисплея — 60, 90 або 120 Гц залежно від моделі пристрою.
Термін вертикальна синхронізація походить від механізму роботи ЕЛТ-моніторів, де електронний промінь малював зображення рядок за рядком зверху вниз. Після завершення кадру промінь повертався у верхній лівий кут — цей момент називався вертикальним гасінням. Сучасні LCD та OLED-дисплеї зберегли цей термін, хоча фізично працюють інакше.
GPU рендерить кадри в back buffer, а дисплей читає з front buffer. VSync гарантує, що перемикання буферів (swap) відбувається тільки в момент VBlank — коли дисплей завершив показ поточного кадру і готовий до наступного. Цей механізм називається подвійною буферизацією з синхронізацією по VBlank.
Подвійна буферизація використовує два буфери: front buffer, що відображається на екрані, і back buffer, у який GPU пише поточний кадр. Коли кадр готовий, буфери міняються місцями. При увімкненому VSync цей swap відкладається до найближчого VBlank. GPU простоює, якщо кадр готовий раніше VBlank, що знижує продуктивність, але усуває tearing.
// OpenGL — включення VSync через WGL_EXT_swap_control
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync увімкнено, 0 = вимкнено
VBlank — короткий проміжок часу між останнім рядком поточного кадру та першим рядком наступного. У цей момент дисплей не оновлює пікселі, і перемикання буферів відбувається без артефактів. Тривалість VBlank залежить від частоти оновлення: при 60 Гц на дисплеї 1080p VBlank триває приблизно 1.4 мс. Якщо GPU не встигає завершити рендеринг до VBlank, кадр пропускається, і дисплей показує попередній кадр ще один цикл — це сприймається як статер.
Потрійна буферизація вирішує проблему простоїв GPU, додаючи третій буфер. GPU може почати рендеринг наступного кадру одразу, навіть якщо один із back buffer-ів очікує VBlank. Це збільшує FPS при VSync, але додає додатковий кадр затримки. На мобільних пристроях потрійна буферизація використовується в деяких ігрових рушіях і у Vulkan через Mailbox mode.
Вимкнений VSync дає максимальний FPS і мінімальний input lag, але ціною візуальних артефактів. Для мобільних ігор і додатків із плавною анімацією вибір між VSync та його вимкненням — компроміс між чіткістю зображення та чуйністю управління.
Screen tearing — горизонтальний розрив, при якому верхня частина екрана показує попередній кадр, а нижня — вже наступний. Це відбувається, коли GPU міняє буфери в середині циклу розгортки дисплея. На мобільних пристроях tearing особливо помітний при швидкому скролінгу або в динамічних сценах з високою частотою кадрів. OLED-дисплеї з їх миттєвим відгуком роблять tearing більш контрастним порівняно з LCD.
Інтенсивність tearing залежить від співвідношення FPS і частоти оновлення. При 60 FPS на 60 Гц екрані tearing проявляється як одна статична лінія, а при 300 FPS на 60 Гц — як множинні хвилясті розриви, що рухаються зверху вниз. Чим вищий FPS відносно частоти оновлення, тим більше розривів і тим вони помітніші.
Input lag при VSync — затримка між натисканням кнопки та відображенням результату на екрані. Вертикальна синхронізація додає в середньому один кадр затримки (16.7 мс при 60 Гц), а при потрійній буферизації — до двох кадрів. Для звичайних додатків ця затримка непомітна, але для шутерів, файтингів і ритм-ігор вона критична: професіонали помічають затримку навіть у 8 мс.
За даними дослідження NVIDIA (2024), середній input lag у CS:GO при 60 FPS без VSync становить 22 мс, а з VSync — 39 мс. При 144 FPS різниця скорочується до 14 vs 18 мс відповідно. На мобільних платформах input lag VSync менш критичний через сенсорне введення, де апаратна затримка тачскрина (10–30 мс) маскує додаткову затримку синхронізації.
У мобільній розробці VSync керується через графічні API, ігрові рушії та системні налаштування ОС. iOS надає менше контролю, Android — більше через Vulkan і OpenGL ES. Вибір режиму залежить від типу додатка: ігри, UI чи відео.
Unity використовує налаштування QualitySettings.vSyncCount: 0 — вимкнено, 1 — VSync через кожен VBlank, 2 — через кожен другий (FPS знижується вдвічі). У Unreal Engine VSync керується через r.VSync консольну команду та DefaultEngine.ini. Для мобільних збірок рекомендується вимикати VSync в Unity і використовувати власний FPS-лімітер, оскільки вбудований VSync в Android SurfaceFlinger може створювати непередбачувані затримки.
// Unity — керування VSync та FPS
void Awake()
{
// 0 = VSync вимкнено, 1 = VSync увімкнено
QualitySettings.vSyncCount = 0;
// Власний лімітер FPS замість VSync
Application.targetFrameRate = 60;
}
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 з очікуванням VBlank | 1 кадр |
| Mailbox | Потрійна буферизація, відкидання старих кадрів | 1–2 кадри |
| Immediate | Без синхронізації, максимальний FPS | 0 кадрів |
FPS-лімітер — альтернатива VSync, при якій додаток обмежує частоту кадрів програмно, не чекаючи VBlank. Такий підхід дає передбачувану затримку і не залежить від частоти оновлення дисплея. На Android FPS-лімітування реалізують через Choreographer, на iOS — через CADisplayLink з ручним контролем часу виведення.
Традиційний VSync має фундаментальний недолік: він прив'язаний до фіксованої частоти оновлення дисплея. Якщо GPU видає 45 FPS на 60 Гц екрані, VSync не може показувати 45 кадрів — він показує 30 (пропускаючи кожен другий VBlank) або чергує 60 і 30 з нерівномірними інтервалами. Це створює статер, який псує враження від гри сильніше, ніж tearing.
Adaptive Sync (FreeSync, G-Sync, Apple ProMotion) вирішує цю проблему, динамічно змінюючи частоту оновлення дисплея відповідно до FPS додатка. Якщо додаток видає 47 FPS, дисплей перемикається на 47 Гц — кожен кадр показується рівно один раз, без розривів і статера. ProMotion в iOS автоматично вибирає частоту від 24 до 120 Гц, балансуючи плавність і енергоспоживання.
На мобільних пристроях Adaptive Sync стає стандартом: iPad Pro (2017+) з ProMotion, Android-флагмани з LTPO-дисплеями (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) підтримують динамічну частоту оновлення від 1 до 120 Гц. Для розробника це означає, що VSync у традиційному сенсі замінюється системним управлінням — достатньо встановити targetFrameRate, а ОС сама підлаштує частоту оновлення для оптимального балансу плавності та заряду батареї.
Часті запитання
Ні. Для динамічних ігор (шутерів, файтингів) VSync збільшує input lag без значної користі — tearing на мобільних OLED-екранах менш помітний через малий розмір дисплея. Для казуальних ігор та UI VSync покращує сприйняття плавності.
VSync знижує енергоспоживання, тому що GPU не рендерить зайві кадри. При вимкненому VSync GPU працює на максимальній частоті, а кожен невідображений кадр витрачає енергію та нагріває пристрій без користі для користувача.
VSync синхронізує виведення кадрів із VBlank дисплея, а FPS-лімітер просто обмежує частоту рендерингу в коді додатка. FPS-лімітер не усуває tearing, але дає передбачувану затримку без прив'язки до герцовки екрана.
Коли GPU не встигає завершити кадр до VBlank, VBlank пропускається, і кадр показується два цикли оновлення. На 60 Гц це дає 30 FPS. Потрійна буферизація пом'якшує цей ефект, дозволяючи GPU почати наступний кадр без очікування.
Так. iOS ProMotion (iPad Pro, iPhone 13 Pro+) підтримує динамічну частоту 24–120 Гц. Android через LTPO-панелі підтримує 1–120 Гц. Розробнику не потрібно вручну керувати цим — система вибирає оптимальну частоту автоматично.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також