Зачем нужна вертикальная синхронизация в видеокартах?
АрхивВидеоВ форумах, посвященных настройке видеокарт, с завидной регулярностью появляются вопросы, посвященные тому, стоит ли включать в драйверах карт так называемую вертикальную синхронизацию или нет. О том, что это такое, и зачем это нужно - читайте в этой статье.
<DIV>Наверняка многие любители компьютерных игр сталкивались с рекомендацией отключать в играх так называемую "вертикальную синхронизацию" или VSync в настройках видеокарты. Во многих тестах производительности графических контроллеров отдельно подчеркивается, что тестирование производилось при отключенной VSync. Что же это такое, и зачем оно нужно, если многие "продвинутые специалисты" советуют отключать эту функцию?</DIV><P>Чтобы понять смысл вертикальной синхронизации, необходимо совершить небольшой экскурс в историю. Первые компьютерные мониторы работали с фиксированными разрешениями и с фиксированными частотами развертки. С появлением мониторов EGA появилась необходимость выбора различных разрешений, что обеспечивалось двумя режимами работы, которые задавались полярностью сигналов синхронизации изображения по вертикали. Мониторам, поддерживающим разрешение VGA и выше, потребовалась уже точная настройка частот развертки. Для этого использовались уже два сигнала, отвечающие за синхронизацию изображения как по горизонтали, так и по вертикали. В современных мониторах за подстройку развертки в соответствии с установленным разрешением отвечает специальная микросхема-контроллер.</P>
<P>Для чего же в настройках видеокарт сохранен пункт "вертикальная синхронизация", если монитор способен автоматически настраиваться в соответствии с установленным в драйвере режимом? Дело в том, что, несмотря на то, что видеокарты способны генерировать очень большое число кадров в секунду, мониторы не могут его качественно отображать, в результате чего возникают различные артефакты: полосность и "рваное" изображение. Чтобы этого избежать, в видеокартах предусматривается режим предварительного опроса монитора о его вертикальной развертке, с которой и синхронизируется число кадров в секунду - всем знакомые fps. Иными словами, при частоте вертикальной развертки 85 Гц число кадров в секунду в любых играх не будет превышать восьмидесяти пяти.</P>
<P>Частота вертикальной развертки монитора означает, сколько раз обновляется экран с изображением в секунду. В случае с дисплеем на основе электронно-лучевой трубки, сколько бы кадров в секунду не позволял "выжать" из игры графический ускоритель, частота развертки физически не может быть выше установленной. В жидкокристаллических мониторах не существует физического обновления всего экрана: здесь отдельные пиксели могут светиться или не светиться. Однако сама технология передачи данных через видеоинтерфейс предусматривает, что на монитор от видеокарты передаются кадры с определенной скоростью. Поэтому, с долей условности, понятие "развертки" применимо и к ЖК-дисплеем. </P>
<P>Откуда же появляются артефакты изображения? В любой игре количество генерируемых кадров в секунду постоянно меняется, в зависимости от сложности картинки. Поскольку частота развертки у монитора постоянная, рассинхронизация между fps, передаваемыми видеокартой, и скоростью обновления монитора приводит к искажению изображения, которое как бы разделяется на несколько произвольных полос: одна часть из них успевает обновиться, а другая - нет.</P>
<P>К примеру, монитор работает с частотой развертки 75 Гц, а видеокарта в какой-либо игре генерирует сто кадров в секунду. Иными словами, графический ускоритель работает примерно на треть быстрее, чем система обновления монитора. За время обновления одного экрана карта вырабатывает 1 кадр и треть следующего - в результате на дисплее прорисовывается две трети текущего кадра, а его треть заменяется третью кадра следующего. За время очередного обновления карта успевает сгенерировать две трети кадра и две трети следующего, и так далее. На монитор же в каждые два из трех тактов развертки мы наблюдаем треть изображения от другого кадра - картинка теряет плавность и "дергается". Особенно заметен этот дефект в динамичных сценах или, например, когда ваш персонаж в игре осматривается.</P>
<P>Однако было бы в корне неправильным считать, что если видеокарте запретить генерировать более 75 кадров в секунду, то с выводом изображения на дисплей с частотой вертикальной развертки 75 Гц все было бы в порядке. Дело в том, что в случае с обычной, так называемой "двойной буферизацией", кадры на монитор поступают из первичного кадрового буфера (front buffer), а сам рендеринг осуществляется во вторичном буфере (back buffer). По мере заполнения вторичного буфера кадры поступают в первичный, однако поскольку операция копирования между буферами занимает определенное время, если обновление развертки монитора придется на этот момент, подергивания изображения все равно избежать не удастся. </P>
<P>Вертикальная синхронизация как раз и решает эти проблемы: монитор опрашивается на предмет частоты развертки и копирование кадров из вторичного буфера в первичный запрещается до того момента, пока изображение не обновится. Эта технология прекрасно работает, когда скорость генерации кадров в секунду превышает частоту вертикальной развертки. Но как же быть, если скорость рендеринга кадров падает ниже частоты развертки? К примеру, в некоторых сценах у нас число fps снижается со 100 до 50.</P>
<P>В этом случае происходит следующее. Изображение на мониторе обновилось, первый кадр копируется в первичный буфер, а две трети второго "рендерятся" во вторичном буфере, после чего следует очередное обновление изображения на дисплее. В это время видеокарта заканчивает обработку второго кадра, который она еще не может отправить в первичный буфер, и происходит очередное обновление изображение тем же самым кадром, который все еще хранится в первичном буфере. Потом все это повторяется, и в результате мы имеем ситуацию, когда скорость вывода кадров в секунду на экран в два раза ниже, чем частота развертки и на треть ниже потенциальной скорости рендеринга: видеокарта сначала "не успевает" за монитором, а потом ей, напротив, приходится ожидать, пока дисплей повторно заберет кадр, хранящийся в первичном буфере, и пока во вторичном буфере освободится место для расчета нового кадра. </P>
<P>Получается, что в случае с вертикальной синхронизацией и двойной буферизацией качественное изображение мы может получить только в том случае, когда число кадров в секунду равно одному из дискретной последовательности значений, рассчитываемых как соотношение частоты развертки к некоторому положительному целому числу. К примеру, при частоте обновления 60 Гц число кадров в секунду должно быть равным 60 или 30 или 15 или 12 или 10 и т.д. Если потенциальные возможности карты позволяют генерировать менее 60 и более 30 кадров в секунду, то реальная скорость рендеринга будет падать до 30 fps. </P>
<P>Вернемся к нашему примеру с частотой развертки 75 Гц и 100 кадрам в секунду. При включении вертикальной синхронизации артефакты изображения пропадают. Когда скорость рендеринга в особо сложных сценах снижается примерно до 60 fps и включена VSync, реальная же скорость расчета кадров падает почти вдвое. Иными словами, вертикальная синхронизация в сочетании с двойной буферизацией хороша только тогда, когда скорость рендеринга не падает ниже частоты развертки, поскольку в других случаях производительность резко падает.</P>
<P>Согласитесь, было странным, если бы инженеры не нашли решения этой проблемы. Чтобы скорость рендеринга не падала из-за ожидания, пока освободится первичный буфер, была разработана технология тройной буферизации - то есть в описанную выше схему был добавлен еще один кадровый буфер. Благодаря этому карта может не дожидаться освобождения первичного буфера и рассчитывать картинку в этом третьем буфере.</P>
<P>Работает тройная буферизация следующим образом (при скорости рендеринга 50 кадров в секунду и частоте обновления монитора 75 Гц). Первый кадр находится в первичном буфере, две трети второго кадра обрабатываются во вторичном буфере. После обновления экрана первым кадром во вторичный буфер поступает последняя треть второго кадра, а треть третьего кадра начинает "рендериться" в третьем буфере. После второго обновления экрана первым кадром второй кадр копируется в первичный буфер, а первая треть третьего кадра перемещается во вторичный буфер. Оставшиеся две трети кадра номер три обрабатываются в третьем буфере, происходит первое обновление экрана вторым кадром, а кадр три полностью переносится во вторичный буфер. Затем этот процесс повторяется с начала.</P>
<P>Как нетрудно подсчитать, в данном случае два кадра выводятся на экран за три цикла обновления, что составляет две трети от частоты развертки, то есть, 50 кадров в секунду, а это и есть полная потенциальная скорость рендеринга для рассматриваемого примера. Благодаря схеме тройной буферизации минимизируется время простоя видеокарты, и, как видим, это дает очень хорошие результаты.</P>
<P>К сожалению, тройную буферизацию поддерживают далеко не все компьютерные игры. К тому же, она отнимает вычислительные ресурсы и определенную часть видеопамяти. Однако пока альтернативы этой технологии для получения высококачественного изображения при низкой скорости рендеринга не существует.</P>
<P>После прочтения этого материала у некоторых может возникнуть вопрос: так стоит задействовать вертикальную синхронизацию в настройках видеокарты или лучше все-таки ее отключить. Однозначного ответа на этот вопрос нет. Очевидно, что если вы просто хотите посмотреть, на что способна ваша видеокарта и "прогнать" какие-то синтетические или игровые тесты, то VSync лучше отключить. В этом случае вы не собираетесь наслаждаться картинкой или игровым процессом, а просто хотите получить информацию о максимальной производительности видеокарты в тех или иных единицах измерения. Кстати, все тестирования графических процессоров проводятся с отключенной вертикальной синхронизацией, поэтому в реальных игровых ситуациях карта может оказаться заметно медленней, чем о ней отзывались в том или ином тесте.</P>
<P>Если вы хотите получить максимальное качественное изображение без артефактов, то стоит включить вертикальную синхронизацию. Единственным недостатком этого решения будет резкое падение производительности в особо сложных сценах, когда скорость рендеринга становится ниже частоты развертки монитора. С этим можно бороться только к том случае, если конкретное приложение поддерживается тройную буферизацию, в противном случае придется либо отключить VSync, либо смириться с временно скромной производительностью как с неизбежным фактом. </P>
<P>Посмотрим на примере "Центра управления" для видеокарт ATI (Catalyst Control Center), как включить или отключить вертикальную синхронизацию и тройную буферизацию. Напомним, что Catalyst Control Center работает только при наличии установленной в системе среды .NET Framework 1.1, которую можно бесплатно скачать с сайта Misrosoft. Этой утилитой пользоваться необязательно - все видеокарты ATI могут работать и с традиционной "Панелью управления" (Control Panel).</P>
<P><IMG height=378 alt=vertical_refresh src="http://img.terralab.ru/pubimages/98286.jpg" width=377 border=0></P>
<P>Чтобы получить доступ к настройкам VSync, необходимо в "дереве" слева выбрать пункт 3D и подпункт All Settings - раздел Wait For Vertical Refresh. По умолчанию установлены следующие настройки: вертикальная синхронизация отключена, но ее может задействовать запущенное приложение. Это самая разумная настройка, и в подавляющем большинстве случаев ее изменять не стоит. Если перевести рычажок в крайнее левое положение, то VSync будет принудительно отключена, в крайнее правое - принудительно включена. Крайнее левое положение обеспечит максимально возможную производительность, а крайнее правое - наивысшее качество. Здесь же можно включить вертикальную синхронизацию, но если приложение ее не требует, то она использоваться не будет.</P>
<P><IMG height=378 alt=triple_buffering src="http://img.terralab.ru/pubimages/98285.jpg" width=377 border=0></P>
<P>Включить тройную буферизацию можно, зайдя в пункт 3D и подпункт API Specific. Здесь сразу становится очевидным, почему эту возможность поддерживают далеко не все игры: тройная буферизация возможна лишь для приложений, работающих с программным интерфейсом (API) OpenGL. Соответствующая строчка предусмотрена именно в настройках для этого API - второй пункт снизу. По умолчанию тройная буферизация отключена.</P>
<P>Наконец, еще раз подчеркнем, что все вышеизложенное касается и ЭЛТ-, и ЖК-мониторов. Несмотря на принципиальные отличия в принципах вывода изображения, для видеокарты (то есть, ее драйвера, операционной системы и конкретного приложения) это однотипные устройства, на которые отправляются сгенерированные кадры с определенной частотой. Впрочем, владельцам жидкокристаллических дисплеев повезло больше: для этих мониторов типичная частота развертки - всего 60 Гц, а при наличии мощной видеокарты скорость рендеринга будет падать ниже 60 fps в редких случаях. </P>
<P>Надеемся, что эта небольшая статья помогла вам получить ответы на вопросы, которые с завидной регулярностью появляются в форумах по видеокартам. Как видите, все довольно просто, но и неоднозначно... </P>