Сегодня мы обращаемся к одному из наиболее часто задаваемых вопросов в компьютерных играх: сколько кадров в секунду нужно для игрока? Есть ли разница в играх между мониторами с поддержкой 60 Гц и 500 Гц?
Чтобы ответить на эти вопросы, нам нужно немного поговорить о том, как графический процессор и дисплей работают вместе, чтобы отправлять кадры нам и как такие технологии, как функция Vsync помогают им в этом.
Но суть в том, что запуск игр с чрезвычайно высокой частотой кадров, значительно выше частоты обновления вашего монитора, приведет к более гибкому игровому опыту с более низкой воспринимаемой задержкой ввода. Это ответ на вопрос для тех, кто не хочет ждать до конца. Теперь поговорим о том, почему это важно.
Предположим, у нас есть монитор с фиксированной частотой обновления 60 Гц. Другими словами, монитор обновляет свой дисплей каждые 1/60 секунды или каждые 16,7 мс. При запуске игры нет гарантии, что графический процессор сможет отображать каждый кадр ровно 16,7 миллисекунд. Иногда это может занять 20 мс, иногда это может занять 15 мс, иногда это может занять 8 мс. Это различная природа рендеринга игры на графическом процессоре.
При этой переменной скорости рендеринга есть выбор того, как каждый обработанный кадр передается на монитор. Он может передать новый кадр на дисплей, как только он будет полностью визуализирован, обычно как запуск игры с «Vsync» или вертикальной синхронизацией, или он может дождаться, пока дисплей не будет готов к обновлению перед отправкой нового кадра, с помощью настройки «Vsync on».
Используя первый метод, Vsync выключен, вызывает разрывы. Это связано с тем, что дисплей не может обновить все изображение мгновенно, вместо этого он обновляется по строкам, обычно от верхней части дисплея до нижней. Во время этого процесса новый кадр может быть готов из графического процессора, и поскольку мы не используем Vsync, кадр немедленно отправляется на дисплей. В результате, через середину обновления, монитор получает новые данные и обновляет оставшуюся часть строк на дисплее с помощью этих новых данных. Затем вы остаетесь с изображением, где верхняя половина экрана находится из предыдущего кадра, а нижняя половина - из нового, недавно доступного кадра.
В зависимости от отображаемого содержимого это разделение между новыми и старыми кадрами в одном обновлении представляет собой разрыв или видимую линию между старыми и новыми кадрами. Обычно это наиболее заметно в быстро движущихся сценах, где есть большая разница между одним кадром и следующим.
В то время как Vsync off приводит к разрыву, он имеет преимущество отправки кадра на дисплей, как только он будет завершен, для низкой задержки между графическим процессором и дисплеем. Помните об этом позже.
Vsync включен
Альтернативный способ отображения изображения - включить Vsync. Здесь вместо того, чтобы графический процессор сразу посылал новый кадр на дисплей, он перемещает каждый визуализированный кадр в буфер. Первый буфер используется для хранения обрабатываемого кадра в настоящее время, а второй буфер используется для хранения кадра, который в данный момент отображается на дисплее. Ни при каких условиях во время обновления второй буфер не обновляется, поэтому на дисплее отображаются только данные из одного полностью отображаемого фрейма, и в результате вы не получаете разрыва с обновлениями в середине.
Vsync on, более пристальный взгляд
Единственная точка, в которой обновляется второй буфер, находится между обновлениями. Чтобы это произошло, GPU ждет после завершения рендеринга кадра, пока дисплей не начнет обновляться. Затем он перетасовывает буферы, начинает рендеринг нового кадра, и процесс повторяется. Иногда процесс может включать несколько буферов до того, как кадр достигнет экрана, но это общий принцип работы Vsync.
Есть две проблемы с Vsync. Во-первых, если скорость рендеринга графического процессора слишком медленная, чтобы не отставать от частоты обновления дисплея, скажем что она способна отображать только при 40 FPS на дисплее 60 Гц - тогда графический процессор не будет полностью отображать кадр, чтобы соответствовать началу обновления дисплея, поэтому кадр повторяется. Это вызывает фризы, поскольку некоторые кадры отображаются только один раз, а другие отображаются дважды.
Vsync: дисплей 60 Гц, 200 FPS
Вторая проблема возникает, когда ваш графический процессор работает очень быстро и легко может отображать кадр в пределах интервала обновления. Предположим, он может отображать на 200 FPS, создавая новый кадр каждые 5 мс, за исключением того, что вы используете дисплей с частотой 60 Гц с окном обновления 16,7 мкс.
Когда Vsync включен, ваш GPU завершит следующий кадр, который будет отображаться в 5 мс, затем он будет ждать 11,7 мс перед отправкой кадра во второй буфер, который будет отображаться на мониторе, и начиная с следующего кадра. Вот почему с Vsync on самая высокая частота кадров, которую вы получите, соответствует частоте обновления вашего монитора, поскольку GPU по сути «заблокирован» в рендеринге не быстрее, чем частота обновления.
Мы часто слышим такие вещи, как «блокировка GPU для обновления моего монитора с помощью Vsync - это здорово, потому что, если он работает быстрее, чем частота обновления, эти кадры теряются, потому что монитор не может их показать, и все, что я получаю разрывается». Многие люди указывают на экономию энергии при использовании Vsync; ваш графический процессор не должен работать так сильно, нет никакой выгоды для работы при частоте кадров выше, чем частота обновления монитора, поэтому работайте на заблокированном FPS и сохраняйте некоторую мощность.
Мы можем понять, почему люди пришли к такому выводу, и там есть некоторые истины, но в целом это не так. И причина этого в том, что вы не факторизуете время обработки входных данных и сколько времени требуется для того, чтобы эти входы материализовались на дисплее.