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 Гц залежно від моделі пристрою.

Термін вертикальна синхронізація походить від механізму роботи ЕЛТ-моніторів, де електронний промінь малював зображення рядок за рядком зверху вниз. Після завершення кадру промінь повертався у верхній лівий кут — цей момент називався вертикальним гасінням. Сучасні LCD та OLED-дисплеї зберегли цей термін, хоча фізично працюють інакше.

Як працює вертикальна синхронізація

GPU рендерить кадри в back buffer, а дисплей читає з front buffer. VSync гарантує, що перемикання буферів (swap) відбувається тільки в момент VBlank — коли дисплей завершив показ поточного кадру і готовий до наступного. Цей механізм називається подвійною буферизацією з синхронізацією по VBlank.

Механізм подвійної буферизації

Подвійна буферизація використовує два буфери: front buffer, що відображається на екрані, і back buffer, у який GPU пише поточний кадр. Коли кадр готовий, буфери міняються місцями. При увімкненому VSync цей swap відкладається до найближчого 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 Гц на дисплеї 1080p VBlank триває приблизно 1.4 мс. Якщо GPU не встигає завершити рендеринг до VBlank, кадр пропускається, і дисплей показує попередній кадр ще один цикл — це сприймається як статер.

Потрійна буферизація вирішує проблему простоїв GPU, додаючи третій буфер. GPU може почати рендеринг наступного кадру одразу, навіть якщо один із back buffer-ів очікує VBlank. Це збільшує FPS при VSync, але додає додатковий кадр затримки. На мобільних пристроях потрійна буферизація використовується в деяких ігрових рушіях і у Vulkan через Mailbox mode.

Основні проблеми без VSync

Вимкнений VSync дає максимальний FPS і мінімальний input lag, але ціною візуальних артефактів. Для мобільних ігор і додатків із плавною анімацією вибір між VSync та його вимкненням — компроміс між чіткістю зображення та чуйністю управління.

Розрив кадру (Screen Tearing)

Screen tearing — горизонтальний розрив, при якому верхня частина екрана показує попередній кадр, а нижня — вже наступний. Це відбувається, коли GPU міняє буфери в середині циклу розгортки дисплея. На мобільних пристроях tearing особливо помітний при швидкому скролінгу або в динамічних сценах з високою частотою кадрів. OLED-дисплеї з їх миттєвим відгуком роблять tearing більш контрастним порівняно з LCD.

Інтенсивність tearing залежить від співвідношення FPS і частоти оновлення. При 60 FPS на 60 Гц екрані tearing проявляється як одна статична лінія, а при 300 FPS на 60 Гц — як множинні хвилясті розриви, що рухаються зверху вниз. Чим вищий FPS відносно частоти оновлення, тим більше розривів і тим вони помітніші.

Затримка введення (Input Lag)

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 у мобільній розробці

У мобільній розробці 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 Гц екрані, 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 у мобільних іграх?

Ні. Для динамічних ігор (шутерів, файтингів) VSync збільшує input lag без значної користі — tearing на мобільних OLED-екранах менш помітний через малий розмір дисплея. Для казуальних ігор та UI VSync покращує сприйняття плавності.

Як VSync впливає на батарею мобільного пристрою?

VSync знижує енергоспоживання, тому що GPU не рендерить зайві кадри. При вимкненому VSync GPU працює на максимальній частоті, а кожен невідображений кадр витрачає енергію та нагріває пристрій без користі для користувача.

У чому різниця між VSync та FPS-лімітером?

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

Чому при VSync FPS може впасти вдвічі?

Коли GPU не встигає завершити кадр до VBlank, VBlank пропускається, і кадр показується два цикли оновлення. На 60 Гц це дає 30 FPS. Потрійна буферизація пом'якшує цей ефект, дозволяючи GPU почати наступний кадр без очікування.

Чи підтримують iOS та Android Adaptive Sync?

Так. iOS ProMotion (iPad Pro, iPhone 13 Pro+) підтримує динамічну частоту 24–120 Гц. Android через LTPO-панелі підтримує 1–120 Гц. Розробнику не потрібно вручну керувати цим — система вибирає оптимальну частоту автоматично.

Підсумки

  • 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також