Статьи по компьютерам
Компьютерные видеокарты

VSync в настройках видеокарты. Часть 1

VSync в настройках видеокарты

Наверняка многие любители компьютерных игр сталкивались с рекомендацией отключать в играх так называемую «вертикальную синхронизацию» или VSync в настройках видеокарты.

Во многих тестах производительности графических контроллеров отдельно подчеркивается, что тестирование производилось при отключенной VSync.
Что же это такое, и зачем оно нужно, если многие «продвинутые специалисты» советуют отключать эту функцию?
Чтобы понять смысл вертикальной синхронизации, необходимо совершить небольшой экскурс в историю.

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

Мониторам, поддерживающим разрешение VGA и выше, потребовалась уже точная настройка частот развертки.
Для этого использовались уже два сигнала, отвечающие за синхронизацию изображения как по горизонтали, так и по вертикали.
В современных мониторах за подстройку развертки в соответствии с установленным разрешением отвечает специальная микросхема-контроллер.

Для чего же в настройках видеокарт сохранен пункт «вертикальная синхронизация», если монитор способен автоматически настраиваться в соответствии с установленным в драйвере режимом?
Дело в том, что, несмотря на то, что видеокарты способны генерировать очень большое число кадров в секунду, мониторы не могут его качественно отображать, в результате чего возникают различные артефакты: полосность и «рваное» изображение.

Чтобы этого избежать, в видеокартах предусматривается режим предварительного опроса монитора о его вертикальной развертке, с которой и синхронизируется число кадров в секунду — всем знакомые fps.
Иными словами, при частоте вертикальной развертки 85 Гц число кадров в секунду в любых играх не будет превышать восьмидесяти пяти.

Частота вертикальной развертки монитора означает, сколько раз обновляется экран с изображением в секунду.
В случае с дисплеем на основе электронно-лучевой трубки, сколько бы кадров в секунду не позволял «выжать» из игры графический ускоритель, частота развертки физически не может быть выше установленной.

В жидкокристаллических мониторах не существует физического обновления всего экрана: здесь отдельные пиксели могут светиться или не светиться.
Однако сама технология передачи данных через видеоинтерфейс предусматривает, что на монитор от видеокарты передаются кадры с определенной скоростью.
Поэтому, с долей условности, понятие «развертки» применимо и к ЖК-дисплеем.

Откуда же появляются артефакты изображения?
В любой игре количество генерируемых кадров в секунду постоянно меняется, в зависимости от сложности картинки.
Поскольку частота развертки у монитора постоянная, рассинхронизация между fps, передаваемыми видеокартой, и скоростью обновления монитора приводит к искажению изображения, которое как бы разделяется на несколько произвольных полос: одна часть из них успевает обновиться, а другая — нет.

К примеру, монитор работает с частотой развертки 75 Гц, а видеокарта в какой-либо игре генерирует сто кадров в секунду.
Иными словами, графический ускоритель работает примерно на треть быстрее, чем система обновления монитора.
За время обновления одного экрана карта вырабатывает 1 кадр и треть следующего — в результате на дисплее прорисовывается две трети текущего кадра, а его треть заменяется третью кадра следующего.

За время очередного обновления карта успевает сгенерировать две трети кадра и две трети следующего, и так далее.
На монитор же в каждые два из трех тактов развертки мы наблюдаем треть изображения от другого кадра — картинка теряет плавность и «дергается».
Особенно заметен этот дефект в динамичных сценах или, например, когда ваш персонаж в игре осматривается.

Однако было бы в корне неправильным считать, что если видеокарте запретить генерировать более 75 кадров в секунду, то с выводом изображения на дисплей с частотой вертикальной развертки 75 Гц все было бы в порядке.
Дело в том, что в случае с обычной, так называемой «двойной буферизацией», кадры на монитор поступают из первичного кадрового буфера (front buffer), а сам рендеринг осуществляется во вторичном буфере (back buffer).

По мере заполнения вторичного буфера кадры поступают в первичный, однако поскольку операция копирования между буферами занимает определенное время, если обновление развертки монитора придется на этот момент, подергивания изображения все равно избежать не удастся.

Вертикальная синхронизация как раз и решает эти проблемы: монитор опрашивается на предмет частоты развертки и копирование кадров из вторичного буфера в первичный запрещается до того момента, пока изображение не обновится.
Эта технология прекрасно работает, когда скорость генерации кадров в секунду превышает частоту вертикальной развертки.
Но как же быть, если скорость рендеринга кадров падает ниже частоты развертки?
К примеру, в некоторых сценах у нас число fps снижается со 100 до 50.

В этом случае происходит следующее.
Изображение на мониторе обновилось, первый кадр копируется в первичный буфер, а две трети второго «рендерятся» во вторичном буфере, после чего следует очередное обновление изображения на дисплее.
В это время видеокарта заканчивает обработку второго кадра, который она еще не может отправить в первичный буфер, и происходит очередное обновление изображение тем же самым кадром, который все еще хранится в первичном буфере.

Потом все это повторяется, и в результате мы имеем ситуацию, когда скорость вывода кадров в секунду на экран в два раза ниже, чем частота развертки и на треть ниже потенциальной скорости рендеринга: видеокарта сначала «не успевает» за монитором, а потом ей, напротив, приходится ожидать, пока дисплей повторно заберет кадр, хранящийся в первичном буфере, и пока во вторичном буфере освободится место для расчета нового кадра.

Получается, что в случае с вертикальной синхронизацией и двойной буферизацией качественное изображение мы может получить только в том случае, когда число кадров в секунду равно одному из дискретной последовательности значений, рассчитываемых как соотношение частоты развертки к некоторому положительному целому числу.
К примеру, при частоте обновления 60 Гц число кадров в секунду должно быть равным 60 или 30 или 15 или 12 или 10 и т.д.
Если потенциальные возможности карты позволяют генерировать менее 60 и более 30 кадров в секунду, то реальная скорость рендеринга будет падать до 30 fps.

1 · 2
Статьи по компьютерам