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