адаптированный перевод статьи с сайта ESReality
оригинал - http://www.esreality.com/?a=post&id=522789
Нередко, прожигая драгоценные часы жизни сидя на различных форумах (в частности, на форуме c58), я сталкивался с подобными вопросами: "комп p4 2hhz/512ddr/radeon 9700 в ку3 (cs, ut - нужное подчеркнуть) даёт 60 фпс. ПАЧИМУ?!"=). Есть по крайней мере два решения этой проблемы. Первое - выставление нормального значения переменной com_maxfps (имеется ввиду q3). Однако зачастую надо копать глубже.
V-Sync – сокращение от “Vertical Synchronization”, что по русски звучит так же как и по английски. Если вкратце, эта функция синхронизирует два независимых процесса. Для начала стоит обьяснить, как кадр (фрейм) попадает на экран монитора.
Итак, на монитор поступает постоянный поток информации из буфера Б. Собственно, скорость этого потока есть частота обновления экрана (сокращённо RR - refresh rate) (75 герц, 100, 125 и т.д.)
Видеокарта же в тоже время копирует информацию из буфера А в буфер Б, скорость этого процесса варьируется от 3 (на быстрых машинах) до 11 миллисекунд (на слабых). Этот процесс есть то, что мы привыкли называть fps (frames per second, кадры в секунду).
Оба процесса не имеют никакой связи если vsync не включён. Ну а включённый vsync приравнивает fps к RR. Это значит что если RR равна 60 hz то больше 60 fps в своём любимом q3 вы не получите=).Вся эта петрушка возникает по причине такого явления как “tearing”. Теоритически лучший расклад – это когда fps равны RR, но на практике всё, к сожалению, не так гладко. Fps как правило выше или ниже RR. Tearing – это когда в буфер попадает 2 или более фрейма. Этот эффект “дёрганья" проявляется при отрубленой синхронизации (за исключением того случая когда fps ниже RR не менее чем на половину, но его мы рассматривать не будем – слишком редко так бывает). Это приводит к тому, что выводимое на экран изображение состоит из разных фреймов. Разница между ними мизерная, однако это становится заметно при совершении резких движений. В результате такого безобидного смешивания фреймы начинают или пропадать или отрисовыватся лишнее кол-во раз.
Предположим что у нас есть видеокарта, способная обработать один кадр за 3 миллисекунды, что даёт 333 кадра в секунду, а также монитор с RR = 100 герц (10 миллисек. на каждое обновление). Для большей наглядности рассмотрим несколько примеров:
vsync off 0---------10--------20 0--3--6--9
За то время пока монитор отрисует содержимое буфера Б на экран видеокарта успеет обработать 3 кадра. Таким образом после 3-9 милисекунд кадр попадает в буфер Б и, будучи отрисованным на экран, делится на три части. Ещё один пример:
0---------10--------20--------30 0------7------14
Тоже самое, только в результате выходит не три, а две части. В след. примере fps меньше RR:
0---------10--------20--------30 0-----------12---------24
Большой разницы нет, только теперь каждый кадр отрисовывается дважды.
vsync on
0---------10--------20--------30 0--3_______--3_______--3
вертикальная синхронизация не позволяет рендерится очередному кадру до тех пор пока не произойдёт очередное обновление частоты монитора.
0---------10--------20--------30 0-------8__-------8__-------8
Тут, как видно, всё ok. Третий пример, fps снова меньше RR:
0---------10--------20--------30--------40 0------------13_______------------13_______
Тут вообще косяк полный. Кадр рендерится каждые 20 миллисекунд, что в итоге даёт 50 fps. Если же обработка будет занимать 21 миллисекунду fps упадут до 33. Именно из-за этого игроки как правило отключают vsync.
Теперь перед вами встаёт выбор – или “дёрганье” кадров или постоянные падения fps. Имхо к первому привыкнуть намного проще. При хорошем мониторе, способном делать 120-125 герц без кряхтенья и приличной видеоплате vsynс можно и оставить.
|