- Что такое Input Lag и как он влияет на впечатления от игры
- Как устроен Input Lag?
- Для кого важен Input Lag?
- Как снизить Input Lag?
- Input lag во время рендеринга и как его побеждать
- CPU + GPU
- Так где же лаг?
- 1. Честное решение. IDXGIDevice1::SetMaximumFrameLatency(1)
- 2. Трюк с ID3D11Query
- 3. Воркэраунд через текстуру
- Про попробовать
- Играем через телевизор. Что такое INPUT LAG и как от него избавиться
- Содержание
- Содержание
- Что такое input lag
- Как измерить input lag
- Порядок измерений:
- Как снизить input lag
Что такое Input Lag и как он влияет на впечатления от игры
Объясняем и показываем, как устроен Input Lag и почему это важно.
Input Lag — задержка ввода. Время, которое проходит с момента получения команды до отображения того или иного действия на экране. После нажатия кнопки на контроллере электронике требуется время на просчёт сигнала и вывода картинки на дисплей — из-за этого и происходит задержка ввода.
Как устроен Input Lag?
Задержка ввода состоит из обработки сигнала контроллером, компьютером и дисплеем.
Объяснение от NVIDIA
Сценарист и копирайтер. Утверждает, что видел все фильмы и прошёл все игры, но редакция отказывается ему верить.
Для кого важен Input Lag?
Максимально важен для киберспортивных дисциплин — шутеров, файтингов, MOBA. Запаздывание реакции персонажа на команды влияет на соревнования не меньше, чем скорость реакции игрока. Input Lag — один из важнейших параметров в киберспорте наравне с частотой кадров в секунду. Про FPS мы писали ранее в другой статье.
Киберспортсмен Джордан n0thing Гилберт объясняет важность низкого Input Lag
Задержка ввода влияет на регистрацию выстрелов, низкий лаг позволяет делать фликшоты — это техника, при которой игрок в шутере очень резко целится во врага и метко стреляет.
В соревновательных дисциплинах существует понятие Peeker’s Advantage — преимущество подглядывающего. Заглядывающий за угол игрок имеет преимущество перед противником с другой стороны, что влияет на тактику в шутерах. Peeker’s Advantage зависит от задержки ввода.
Как снизить Input Lag?
Input Lag не прописывают в официальных спецификациях, параметр меняется в зависимости от «железа». На любом ПК есть несколько способов снизить лаг:
- Отключить масштабирование изображения: для этого в параметрах масштаба и разметки дисплея нужно выставить 100%.
- Изменить схему управления питанием и выставить максимальную производительность.
- Отключить сглаживание и вертикальную синхронизацию в настройках игры.
Сравнение процессоров AMD и Intel в Fortnite, CS:GO и других играх
Чтобы снизить Input Lag на ТВ и консоли, следует отключить все программные средства улучшения видеосигнала — например, искусственное повышение плавности в динамичных сценах. По умолчанию все подобные параметры включены.
На время считывания данных из буфера кадров влияет скорость обновления дисплея. У монитора с высокой скоростью обновления задержка будет меньше.
Стоит использовать соответствующее ЖК-панели разрешение. Например, лаг повышается, если 4К-монитор сжимает изображение до Full HD.
Во многих современных телевизорах есть особый игровой режим. При подключении консоли используйте вход HDMI Game.
Для большей скорости отклика на любой платформе имеет смысл отключить HDR — о том, как устроен высокий динамический диапазон, мы писали в другом материале.
Производители «железа» разрабатывают технологии, специально заточенные под киберспорт. Например, NVIDIA Reflex измеряет и оптимизирует задержки системы в соревновательных играх.
обложка: Абрикос Абрикосовый для Skillbox Media
Источник
Input lag во время рендеринга и как его побеждать
Привет всем. Многие из вас знакомы с лагом ввода. Это бывает, когда вас в очередной раз убивают в компьютерной игре, и вы кричите: «Ну я же нажал блок/атаку/уворот». Ну а затем джойстик летит в стену. Знакомо? Происходит это потому, что между нажатием клавиш и появлением результата на экране проходит значительное время. Фактически, когда вы смотрите в экран — вы видите прошлое состояние, которое может абсолютно не отражать действительность.
Если вы разрабатываете собственную игру, или вообще занимаетесь рендером, и хотите уменьшить задержки ввода, то крайне советую заглянуть под кат.
Итак, Input lag в любой игре складывается из:
- Задержки на контроллере
- Сетевого лага (если это онлайн игра)
- Лага рендеринга.
В данной статье мы рассмотрим только третий лаг, связанный с рендером. Нам придется немного углубится в то, как происходит рендеринг на современном компьютере.
CPU + GPU
Современные GPU — устройства максимально асинхронные. CPU отдает команды видеодрайверу, и идет заниматься своими делами. Драйвер накапливает команды в пачки, и пачками отправляет на видеокарту. Видеокарта рисует, а CPU в это время занимается своими делами. Максимальный FPS, который вы можете получить в этой системе ограничен одним из условий:
1. CPU не успевает отдавать команды видеокарте, потому что видеокарта очень быстро рисует. И нафига вы покупали такую мощную видеокарту?
2. Видеокарта не успевает рисовать то, что дает ей CPU. Теперь CPU халявит…
Для того, чтобы посмотреть, как красиво в паре работает CPU и GPU — есть различные профайлеры. Мы воспользуемся GPUView, который идет в составе Windows Performance Toolkit.
Лог от GPUView может выглядеть как-то так:
Вертикальные синие линии — это VSync. Наваленные горы кубиков — это горы пакетов, которые отправятся на видеокарту, когда та освободится. Штрихованный кубик — это пакет, содержащий переключение буферов. Иными словами — конец кадра. Любой кубик можно выбрать, и видеть, как он постепенно опускается в стопке, и отправляется на видеокарту. Видите на скриншоте кубик с желтой обводкой? Он обрабатывался аж на протяжении 3-х vsync-ов. А целый кадр занимает около 4-х VSync-ов (судя по расстоянию между разными штрихованными кубиками). Между двумя горами пакетов от разных кадров есть маленький зазор. Это то время, пока GPU отдыхал. Этот зазор маленький, и оптимизация на стороне CPU не даст большого выйгрыша.
Но бывают зазоры большие:
Это пример рендера из World of Warcraft. Расстояния между пакетами в очереди просто огромные. Более мощная видеокарта не даст прироста ни одного FPS. Зато если оптимизировать рендер на стороне CPU, то можно получить более чем двукратный прирост FPS на данном GPU.
Чуть более подробно можно почитать тут, а мы пойдем дальше.
Так где же лаг?
Так уж сложилось, что разрыв в производительности между Hi-End и Low-End видеокартами поистине огромен. Поэтому у вас обязательно будут возникать обе ситуации. Но самая грустная ситуация — это когда GPU не справляется. Выглядеть это начинает вот так:
Обратите внимание, сколько времени заняла обработка одного пакета. Кадр занимает 4 VSync-а, а обработка пакета занимает в 4 раза дольше! DirectX (OpenGL ведет себя так же) накапливает данных аж на 3 кадра. Но ведь когда мы кладем в очередь свежий кадр — все предыдущие кадры для нас уже не актуальны, а видеокарта по прежнему будет тратить время на отрисовку. Поэтому наше действие появится на экране спустя аж 3 кадра. Давайте посмотрим, что мы можем сделать.
1. Честное решение. IDXGIDevice1::SetMaximumFrameLatency(1)
Я честно, не представляю зачем копить данных на 3 кадра в буфере. Но MS видимо поняла ошибку, и начиная с DX10.1 у нас появилась возможность задать это количество кадров через специальный метод IDXGIDevice1::SetMaximumFrameLatency. Давайте посмотрим, как нам это поможет:
Ну что же. Стало значительно лучше. Но по прежнему не идеально, т.к. все равно ждем 2 кадра. Еще один недостаток решения — то что оно работает только для DirectX.
2. Трюк с ID3D11Query
Идея заключается в том, что в конце кадра мы устанавливаем D3D11_QUERY_EVENT. В начале следующего кадра — ждем, постоянно проверяя событие, и если оно прошло, то только тогда начинаем отдавать команды на отрисовку, и с наисвежайшими Input данными.
Картина практически идеальная, не находите? Ожидание я реализовал вот так:
Установка эвента тривиальна:
Ну и в сам рендер добавляем вначале ожидание. Затем перед самой отрисовкой собираем свежие Input данные, а перед самым Present-ом устанавливаем евент:
Недостаток костыля метода — работает только с DirectX. Но можно дождаться синхронизации другим оригинальным способом.
3. Воркэраунд через текстуру
Вот что мы делаем. У нас есть механизмы прочитать данные из видеоресурсов. Если мы заставим видеокарту что-то нарисовать, а потом попытаемся забрать, то произойдет автоматическая синхронизация между GPU-CPU. Мы не сможем забрать данные раньше, чем они будут нарисованы. Поэтому вместо установки евента я предлагаю генерить мипы на видеокарте для текстуры 2*2, а вместо ожидания евента — забирать данные из этой текстуры в системную память. В результате подход выглядит так:
Вот так мы ожидаем евент:
а вот так его устанавливаем:
В остальном подход полностью аналогичен предыдущему. Преимущество: работает не только на DirectX но и на OpenGL. Недостаток — маааленький оверхед на генерацию текстуры и передачу данных назад + потенциально потраченное время на «пробуждение» потока шедулером операционной системы.
Про попробовать
Конечно я тут растекался по дереву… но насколько проблема серьезная? Как пощупать это? Я написал специальную демонстрационную программу (требует DirectX11).
Скачать *.exe можно здесь. Для тех, кто боится качать билды неизвестного производителя — исходный код lazarus проекта здесь (также потребуется моя библиотека фреймворк AvalancheProject, которая находится вот тут)
Программа представляет собой такое окно:
Тут рисуется 40*40*40=64000 (кстати каждый кубик — отдельный дравколл). GPU workload трекбар дает нагрузку на GPU (с помощью бесполезного цикла в вершинном шейдере). Просто опускаете с помощью этого трекбара фпс до низкого уровня, скажем 10-20, а потом пробуете правой кнопкой мыши крутить кубики, и переключать методы уменьшения Input лага с помощью радиобаттонов.
Вы только оцените какая огромная разница в скорости отклика. C Query Event комфортно крутить кубик даже при 20 фпс.
Источник
Играем через телевизор. Что такое INPUT LAG и как от него избавиться
Содержание
Содержание
Успех виртуальных баталий напрямую зависит от скорости реакции игрока. Но не менее важно, чтобы и информация выводилась с минимальной задержкой. Плохое интернет-соединение и долгая обработка сигнала на мониторе, телевизоре — все это мешает классной игре. Последнее явление получило название INPUT LAG.
Высокая задержка ввода — неприятная проблема. После замены телевизора или в гостях у друзей в глаза бросается запаздывание, с которым персонаж на экране реагирует на команды с геймпада. К небольшим тормозам можно привыкнуть, но слишком большая задержка значительно портит впечатления от игрового процесса.
Что такое input lag
Любому устройству вывода, будь то монитор или телевизор, требуется время на обработатку поступающегоий видеосигнала. Разница в том, что электроника современных игровых мониторов адаптирована для трансляции с минимальной задержкой на входе. Это достигается путем транслирования исходного сигнала, получаемого с видеокарты.
Архитектура телевизоров выполнена намного сложнее. Перед тем, как попасть на матрицу, сигнал подвергается значительной коррекции центральным процессором ТВ. В некоторых сценариях обработка занимает до 150 мс. Такая разница отчетливо заметна пользователю любого уровня. Не обязательно быть профессиональным геймером, чтобы уловить лаг в 1/7 секунды.
Таким образом, INPUT LAG — это время с момента получения сигнала устройством вывода до его отображения на экране.
Наиболее важное влияние время задержки оказывает на динамичные игры. Фанатам шутеров и файтингов критически важен низкий инпут лаг. От него напрямую зависит успех виртуальных баталий. В on-line дуэли выигрывает тот, кто первый увидит врага. И разница даже 50 мс окажется решающей.
Для любителей размеренных жанров — стратегий, RPG — низкое время задержки менее критично, но лишним тоже не будет.
Какую панель можно считать медленной? Однозначного ответа на этот вопрос не существует. Там, где профессиональный геймер заметит долгую задержку, обычный пользователь будет играть с комфортом. Условной границей принято считать отметку 50 мс. Модели с большим значением лучше избегать.
При выборе монитора этот параметр часто путают со временем отклика матрицы, которое показывает, сколько времени требуется пикселю, чтобы изменить своей цвет. Для современных ЖК-панелей значение чаще всего не превышает 12 мс.
Инпут лаг редко прописывают в официальных спецификациях по ряду причин. Во-первых, точно измерить параметр достаточно сложно. В интернете много независимых ресурсов, занимающихся этим вопросом. Значения, полученные в разных источниках для одной модели, часто различаются. Во-вторых, инпут лаг зависит от режима и настроек телевизора. Указание только основных вариантов займет значительную часть в спецификациях модели.
Подробная база с телевизорами и мониторами представлена на https://displaylag.com/display-database/. Ресурс позволяет быстро найти интересующую модель с помощью фильтров и сравнить ее параметры с другими вариантами. Единственный недостаток — приведено наименьшее значение задержки без указания используемых настроек. Ресурс https://www.rtings.com/tv/tools/table/ позволит сравнить инпут лаг в разных режимах.
Как измерить input lag
Техника измерения сводится к сравнению тестируемого устройства с эталонным, время обработки сигнала на котором условно равно нулю. Наиболее подходящим вариантом для этой задачи является монитор на ЭЛТ, подключенный без использования переходников к разъему DVI.
В случае отсутствия, подойдет любой монитор или экран ноутбука. Но в таком случае результат окажется ниже реального. Фактически, вы не получите достоверное значение инпут лага, а сравните устройства по этому параметру.
Порядок измерений:
- Подключить второе устройство (телевизор, монитор, проектор) к свободному разъему в режиме отображения «Повторяющийся» (Win + P).
- Вывести на экраны любой секундомер с точностью до тысячных долей секунды, например https://sekundomer.net/ и запустить его.
- Сфотографировать работающий секундомер так, чтобы на фото попадали оба экрана. Использовать цифровую камеру или телефон с возможностью ручных настроек. Выбрать время выдержки от 1/200 и меньше. Яркость кадра отрегулировать настройками ISO.
- Сделать серию фотографий.
- Разница в показаниях секундомера — искомое значение.
В случае сравнения с монитором на ЭЛТ, результатом тестирования станет точное значение инпут лага. Иначе: Инпут лаг = Разница в показаниях секундомера + Инпут лаг устройства с меньшим показанием секундомера.
Как снизить input lag
Если в системе замечена высокая задержка, и управление ощущается «желейным», не надо сразу начинать поиски нового телевизора или монитора. Первым делом стоит попытаться снизить инпут лаг «подручными» способами. Их можно разделить на две категории, применять которые необходимо комплексно.
- Снижение инпут лага настройками ПК и игр.
- Снижение инпут лага настройками телевизора / монитора.
В первом случае комплекс мер выглядит следующим образом:
- Отключить масштабирование изображения в системе (Win -> Параметры -> Система -> Дисплей -> Масштаб и разметка -> 100% (рекомендуется).
- Изменить схему управления питанием (Win -> Параметры -> Система -> Питание и спящий режим -> Дополнительные параметры питания -> Показать дополнительные съемы -> Максимальная производительность).
- В настройках игр отключить сглаживание и вертикальную синхронизацию.