Войти
ПрограммированиеТерминыГрафика

VSync: Vertical Synchronization (Вертикальная синхронизация)

Вертикальная синхронизация (VSync: Vertical Synchronization) — это опциональный параметр поведения драйвера видеокарты. Включённая вертикальная синхронизация означает, что после отрисовки очередного кадра, во время переключения буферов (функция SwapBuffers() в OpenGL) драйвер будет ждать начала очередного обратного хода луча монитора, и только потом переключит экранные буферы.

Картинка на мониторах с электронно-лучевой трубкой отрисовывается лучом из электронов, который последовательно отрисовывает строки слева направо, потом возвращается в начало очередной строки (задержка горизонтальной синхронизации), затем отрисовывает следующую строку и т.п. После того, как луч попал в правый нижний угол экрана, он возвращается в левый верхний угол (время, за которое он возвращается, называется задержкой вертикальной синхронизации). (На самом деле, в цветных мониторах три луча — R, G, B, но принцип тот же.)

Зачем нужна вертикальная синхронизация? Дело в том, что время задержки вертикальной синхронизации обратного хода луча является идеальным для переключения экранных буферов. Если переключить буферы в любое другое время, то часть изображения на экране будет принадлежать старому кадру, а часть — новому. Из-за этого появятся артефакты «файтинга» между кадрами — может стать заметным неприятное дрожание, и даже при высоких FPS анимация визуально не будет выглядеть плавной.

Однако, так как при вертикальной синхронизации делается задержка, то FPS неизбежно будет меньше, чем на аналогичной сцене, но с выключенным vsync. Это иногда неприемлемо, например,  в разнообразных графических тестах.

Ручное включение или отключение вертикальной синхронизации.

Включить или выключить vsync обычно можно в настройках драйвера видеокарты. Открываете Display Properties (правой кнопкой мыши кликаете по декстопу и выбираете пункт выпадающего меню Properties), выбираете последнюю закладку Settings, нажимаете кнопку Advanced, находите настройки для ожидания вертикальной синхронизации (Wait for Vertical Sync), отключаете или включаете.

Программное включение или отключение вертикальной синхронизации.

Чтобы программно включить или выключить VSync в OpenGL, выполните следующий код:

//дабы не подключать лишних файлов определяем PFNWGLSWAPINTERVALEXTPROC где нибудь в хидере
typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);
//...
void set_vsync(bool enabled) // true -- VSync включен, false -- выключен
{
  PFNWGLSWAPINTERVALEXTPROC wglSwapInterval = NULL;

  wglSwapInterval = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT");
  if ( wglSwapInterval ) wglSwapInterval(enabled ? 1 : 0);
}

Чтобы программно включить или выключить VSync в DirectX 9, выполните следующее:

Перед инициализацией D3DDevice, присвойте полям структуры D3DPRESENT_PARAMETERS следующие значения, чтобы включить синхронизацию:

g_d3d9Parameters.SwapEffect = D3DSWAPEFFECT_COPY;
g_d3d9Parameters.PresentationInterval = D3DPRESENT_INTERVAL_ONE;

что бы выключить синхронизацию

g_d3d9Parameters.SwapEffect = D3DSWAPEFFECT_COPY;
g_d3d9Parameters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

Примечание: При использовании AntiAliasing, вместо D3DSWAPEFFECT_COPY устанавливайте D3DSWAPEFFECT_DISCARD.

Резюме:

1. Если вы хотите увидеть адекватные оценки производительности (FPS и другие), вам необходимо выключить вертикальную синхронизацию.
2. Если вы хотите уменьшить дрожание анимации на экране, попробуйте включить вертикальную синхронизацию. (Для этого FPS должен быть больше частоты VSync, иначе он упадёт очень сильно).

Что такое VSync: Vertical Synchronization (Вертикальная синхронизация)?

#FPS, #синхронизация

4 августа 2005 (Обновление: 16 апр 2012)