Cyberfight Place where challenge is not just a word
 
      Русская версия
English version

 Навигация     
Cyberfight.ru / Колонки / LazyBonez / пресловутый vsync

пресловутый vsync
23:41 16 Oct '03 Комментарии: 30

адаптированный перевод статьи с сайта 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с можно и оставить.


 


Комментарии
#1 - 23:59 / 16 Oct '03 - AgrOnoM
ну а у меня lcd монитор и мне на это vsyncпаплевать
вывод: покупаите lcd мониторы :)



#2 - 0:00 / 17 Oct '03 - AgrOnoM
ну а у меня lcd монитор и мне на это vsync наплевать
вывод: покупаите lcd мониторы :)



#3 - 0:10 / 17 Oct '03 - Mr.PostaL
2 lazy...
дааа... странный ты тип!!!



#4 - 0:23 / 17 Oct '03 - EnZO
Lazy tnx for translating!



#5 - 0:25 / 17 Oct '03 - LEETE
Не любллю орфографические ошибки.
>вертикальная синхронизация не позволяет рендерится очередному кадру



#6 - 0:25 / 17 Oct '03 - LEETE
а еще у меня "л" залипает.
сабж



#7 - 0:33 / 17 Oct '03 - k32-frizzy
po4ti ni4evo ne ponjal :]]



#8 - 0:45 / 17 Oct '03 - Dynamite
:)
Дерганые кадры - це всё херня. Привыкать не надо, и так всё зашибись. Пока ты не сказал, что они дерганые, я этого даже и не знал. :)



#9 - 1:02 / 17 Oct '03 - tmp.Napoleon
Спасибо за перевод статью. Некоторое было новостью, другое я знал. А в целом немного понятнее стал механизм.

Спасибо, это стоящая статья.



#10 - 1:43 / 17 Oct '03 - iQzero
НЕ в тему, но
Настя учись: коротко, без понтов, слез и философии...
респект



#11 - 1:59 / 17 Oct '03 - CmEPTb.
SO GOOD!!!



#12 - 3:17 / 17 Oct '03 - Proz
лучше исправить
> cg_maxfps

com_maxfps



#13 - 9:19 / 17 Oct '03 - Jexx
Краткость сестра таланта... :)
Нифига не понял... Ну суть уловил - картинка у меня дергается



#14 - 10:26 / 17 Oct '03 - elephant
самый лучший вариант...
... поставить com_maxfps 120
и r_displayrefresh 120
и играть без дерганий, рывков и прочей фигни.
Факт.



#15 - 12:55 / 17 Oct '03 - CyberZX
2Lzb
ты написал все правильно, но забыл один очень важный момент. сейчас объясню какой.
игровой цикл в трехмерной игре можно разбить на три последовательные части
1) получение данных от игрока(обработка клавиатуры и мышки)
2) обработка этих данных и реакция игрового мира на них
3) построение 3д-сцены
4) рендеринг 3д-сцены

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



#16 - 17:00 / 17 Oct '03 - shishkin
elephant
поддерживаю, сам так играю!
А еще обязательно воткнуть cl_maxpackets 120 и rate 15000, так вообще шоколадно :-))))



#17 - 19:04 / 17 Oct '03 - n3wB!e^aka^n00b
ну как же откдючить этот vsync никто и не написал....



#18 - 21:42 / 17 Oct '03 - Zerling
2 #17
В НАСТРОЙКАХ ДЕТОНАТОРА ПОКОПАЙСЯ



#19 - 22:20 / 17 Oct '03 - Knez
2 #17
Для опенгл можно и в детонаторе
для директх через риватюнер



#20 - 1:28 / 18 Oct '03 - SurG...
k ogromnomu sojaleniu
takih kolonok oooooooochen' malo...



#21 - 10:01 / 19 Oct '03 - OmicroN_
re
Позоду тут уже есть один omicron, ну да ладно :)

Lazybones, а ты знаешь про такую вещь, как Double buffer, который должна использовать всякая 3d игрушка как минимум? И из которого выходит, что при vsync off и при fps больше в 2 раза, чем sync, происходит налодение одновременно только двух кадров?

А знал ли ты про такую вещь, как triplebuffer? При котором наложение не происходит ВООБЩЕ не при каких обстоятельствах, при vsync on/off, и при котором vsync вообще нафиг не нужен?

попытка показать графику в текстовом режиме с разной величиной знаков не прошла, юзайте фонт courier new :)



#22 - 12:21 / 19 Oct '03 - Armageddon*phoenix
help!
Ребят какой прогой можно исправить проблему 60hz в openGL под XP? карточка Gforce FX, поэтому rivatuner'ом не берёт, старый наверное =



#23 - 13:39 / 19 Oct '03 - LazyBonez
2 omicron
знал



#24 - 15:12 / 19 Oct '03 - OmicroN_
2 Armageddon
бери reforce, он разруливает любые карточки
rivatuner может жаловаться на то, что он не поддерживает дрова. Скажи ему, что он ни за что не отвечает, и можешь его поюзать :)
Только вот если у тебя карточка с tv-out, то могут возникнуть проблемы с ним; лучше юзай reforce.
Reforce можно найти на 3dnews.ru, там же есть и rivatuner rc14



#25 - 17:02 / 19 Oct '03 - |prod|
cg_maxfps - sux
pravilnee pisat' com_maxfps :]



#26 - 18:59 / 19 Oct '03 - LazyBonez
пофиксил=)



#27 - 1:14 / 20 Oct '03 - Hmus-sys
ОТСТОЙ СТАТЬЯ!!!! Я вот тут прочитал и понял это лол полнейший. Надо вам дорогие ребятки на курсы походить. Про железо узнаете много нового =) а то что вы тут пишите что Это решает а это не решает - это отстой. 3Dnews тоже ошибаются частенько - бывает. Я вам всем дам дельный совет - кто юзает постоянно игры - тому не нужен никакой радеон 9700, потому как вы 150 ФПС от 300 не отличите =). Покупайте карточки только nVidia, они надёжней. А тем кто по большей части с графикой и с текстами юзайте Matrox. Кстати многие ошибаются что говорять что эта карточка не для разгона. Вот как раз она подходит для него любимого. G550 можно разогнать и получится вам не боьше не меньше альтернатива geForce 4 Ti4100 - вот так вот. но вот ни прикаких обстоятельствах не получится Ti4200 - =))) так что вот так. Кстати про Vsync, не всегда Синхронизация не нужна, она бывает полезной иногда. Да и ещё LazyBones, ты далеко не всё написал, про Vsync можно книжку написать, я могу часа два рассказывать про неё родную.



#28 - 1:20 / 20 Oct '03 - @ntoh@
r_displayrefresh и циферка частоты моника есть в ку в конфиге прописать мона



#29 - 7:47 / 20 Oct '03 - LazyBonez
2 #27
что ты говоришь? начнём с того, что статья эта с сайта ESReality, а не с 3dnews. Во-вторых - прогресс летит вперёд и уже через каких-то полгода радеон 9700 станет картой среднего класса, про всякие матроксовкие парфелии я вообще молчу - за щеку будут брать только в путь. Про нвидию согласен, сам являюсь её пользователем.
>про Vsync, не всегда Синхронизация не нужна, она бывает полезной иногда
а кто говорил что она всегда не нужна?



#30 - 15:09 / 20 Oct '03 - CyberZX
2OmicroN_
что-то ты напутал, тройной буффер не решает проблему синхронизации. вообще сколько бы буферов у нас не было, но если синхронизация отключена, то есть большая вероятность того что данные в видеобуфер будут заносится в не подходящее время, например когда электроный луч находится на середине экрана, тогда мы увидем на верхней половине монитора предыдущий кадр, а на нижней текущий. Вот для исправления таких ошибок и нужна синхронизация по вертикальному ходу луча.

2 Hmus-sys твои понты вообще не понятны, статья нормальная и многим она дала полезную информацию. И интересно, что же ты можешь рассказывать два часа про синхронизацию? ты хоть знаешь даже такую элементарную вещь, как реализовать эту синхронизацию на асме? :)





Возможность оставить свой комментарий доступна только зарегистрированным пользователям! Зарегистрироваться можно здесь.

Добавь в закладки
Сделай домашней
Прислать новость
IRC #c58



Cyberfight.ru

Top100