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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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