Почему нажатия клавиш запаздывают в играх

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

Большая часть задержки между твоим пальцем и игрой живёт в самой клавиатуре, а не в Windows. Нажатие проходит шесть этапов, прежде чем на экране поменяется хоть один пиксель, и программа может укоротить ровно два из них. Если ты пришёл сюда за значением реестра, которое убирает лаг клавиатуры, честный ответ такой: такого значения не существует — но на трёх из шести этапов бывают настоящие, проверяемые неисправности, и на них стоит потратить двадцать минут.

Эта страница разбирает путь по частям, называет владельца каждой из них и прямо говорит, до чего дотянуться нельзя.

Какой путь на самом деле проходит нажатие

ЭтапЧей онМожет ли программа его укоротить?
1. Переключатель замыкается; контроллер клавиатуры опрашивает свою матрицу и гасит дребезг контактаПрошивка клавиатурыНет
2. Клавиатура выкладывает отчёт на свою конечную точку прерываний USB — с тем интервалом, который запросила её прошивкаПрошивка клавиатурыНет
3. Хост-контроллер забирает отчёт; kbdhid.sys и kbdclass.sys передают его вышеWindows + драйвер чипсетаТолько удалением драйвера, который тормозит
4. Отчёт проходит через фильтрующие драйверы и низкоуровневые перехватчики, сидящие на пути вводаПрограмма клавиатуры, макрослой, оверлейДа
5. Игра читает ввод — в большинстве движков раз в кадрИграКосвенно, через рост частоты кадров
6. Кадр рисуется, выводится, развёртывается и зажигается на матрицеВидеокарта, Windows, мониторЧастично — смотри Задержка ввода, которую не исправит ни одна программа

Этап 1 — то, до чего не дотянется никто

Клавиатура не шлёт сигнал в момент замыкания переключателя. Её собственный контроллер по кругу опрашивает матрицу клавиш, а увидев контакт, выжидает дребезг, прежде чем считать клавишу нажатой. Это ожидание — константа прошивки. Windows его не видит, ни один драйвер не может его прочитать, и ни одно значение реестра на твоей машине его не меняет.

Именно поэтому две клавиатуры на одном и том же ПК ощущаются по-разному при всех прочих равных, и именно поэтому «лаг клавиатуры» так часто оказывается железным ответом, переодетым в программный.

Этап 2 — интервал опроса задаёт сама клавиатура, и это записано

USB-устройства ввода передают данные через конечную точку прерываний, а в дескрипторе этой точки есть поле bInterval, которое сообщает, как часто хосту следует опрашивать устройство. Собственная документация Microsoft по этой структуре не оставляет разночтений: «This value reflects the device's configuration in firmware. Drivers cannot change it.»

Та же страница даёт и пересчёт. На устройстве full-speed bInterval, равный 1, означает период опроса в один кадр длиной 1 миллисекунда — те самые 1000 Гц, которые клавиатуры пишут на коробке. На устройстве high-speed период считается в микрокадрах, по восемь на миллисекунду, по формуле Period = 2 ** (bInterval - 1).

Отсюда следуют две вещи, и это самые полезные предложения на всей странице:

Некоторые клавиатуры приезжают в режиме совместимости (его часто подписывают «boot protocol» или привязывают к переключателю 6-клавишного rollover), и он заодно снижает частоту отчётов. Загляни в руководство самой клавиатуры или в её программу настройки, прежде чем решать, что тормозит Windows.

Две настройки, которые люди меняют и которые этого не делают

Обе есть в каждом списке «как убрать лаг клавиатуры». Ни одна из них не укорачивает путь от нажатия до игры, и нам проще сказать это прямо, чем продавать тебе плацебо.

Задержка и скорость автоповтора клавиш. KeyboardDelay и KeyboardSpeed в HKCU\Control Panel\Keyboard управляют тем, что происходит, когда ты удерживаешь клавишу: через сколько символ начнёт повторяться и как быстро он повторяется дальше. На первое нажатие это не влияет вообще. w0a умеет выставить задержку на самый короткий шаг, и собственное описание в продукте говорит, что именно ты этим получаешь: быструю консоль, чат и меню, а не быстрый выстрел. Если прежняя программа оставила здесь странные значения, карточка Скорость и задержка повтора клавиш вернёт значения Windows по умолчанию.

Размер очереди данных клавиатуры. KeyboardDataQueueSize задаёт, сколько отчётов может удержать драйвер класса, если разбирающий их поток на мгновение подвис. Очередь побольше — меньше потерянных отчётов во время такого подвисания. Прийти раньше от этого не может ни один отчёт, и продукт говорит это прямо в своём интерфейсе, а не сноской. Очереди ввода объясняют, что это за значение и как вернуть его назад.

Если где-нибудь тебе скажут, что увеличение размера очереди снижает задержку ввода, ты уже знаешь достаточно, чтобы не поверить. Очередь — это запас против потерь, а не короткий путь.

Этап 4 — единственный этап, который действительно твой

Именно здесь на обычной машине живёт настоящая, измеримая задержка клавиатуры — и именно этот этап почти никто не проверяет.

Всё, что хочет увидеть твои нажатия раньше игры, встраивается в путь ввода: фирменные программы клавиатур с макродвижками, службы подсветки, реагирующие на набор, оверлеи стриминга и чата, программы записи экрана, утилиты переназначения клавиш, средства специальных возможностей. Каждая из них — лишний перегон, а перегон, который занят или завис, держит весь путь.

На этот случай в Windows есть тайм-аут. Когда низкоуровневый перехватчик ввода не отвечает в течение LowLevelHooksTimeout миллисекунд, Windows пропускает его и идёт дальше; Windows 10 1709 и новее используют не больше 1000 мс, каким бы большим ни было значение. Сколько Windows ждёт, когда значение не задано, не задокументировано, и мы этого не измеряли. На странице Твики реестра в w0a есть запись Ограничить, как долго зависший перехватчик ввода держит мышь: она задаёт для этого ожидания 1000 мс, записывая LowLevelHooksTimeout в HKCU\Control Panel\Desktop.

Прочитай это честно: ограничение тайм-аута не ускоряет здоровый перехватчик. Оно укорачивает заморозку, когда перехватчик уже сломался. Вещь полезная — но это не снижение задержки.

Что действительно стоит сделать, по порядку:

  1. Закрой собственную программу клавиатуры полностью — не сворачивай её в трей. Выйди из неё и сыграй раунд.
  2. Закрывай оверлеи по одному: оверлей игровой платформы, оверлей голосового чата, программу записи, оверлей производителя видеокарты.
  3. Если ощущение изменилось — ответ найден, и дальше ты сам решаешь, какая функция каких миллисекунд стоит.
  4. Если ничего не изменилось, здесь больше не ищи. Переходи к этапу 3.

Этап 3 — драйвер, занявший ядро, которое нужно клавиатуре

Отчёт клавиатуры приходит как прерывание. Если на этом ядре процессора сидит посторонний драйвер — внутри прерывания или отложенного вызова, — твоё нажатие ждёт, и ждёт оно выше любого приоритета потоков в системе, а значит, не попадает ни в один график времени кадра и ни в один диспетчер задач.

Это измеримо — и это единственная часть пути, которой можно поставить число прямо на твоей машине:

  1. Открой Тест задержки в w0a.
  2. Нажми старт и двигай мышью все 12 секунд — мышь даёт тесту тот трафик, по которому он и опрашивает путь ввода.
  3. Смотри на Самое долгое удержание драйвером и на список драйверов под ним: он отсортирован по длительности удержания и называет файл.
  4. Всё, что достигает 1 мс, вытесняет отчёты. Всё, что достигает 4 мс, чинится раньше всего остального.

С драйвером, удерживающим ядро, первым делом стоит попробовать обновить именно этот драйвер с сайта производителя железа. Как читать тест задержки объясняет цвета и — что полезнее — то, чего это число намеренно не включает.

Этап 5 — игра читает ввод по своему расписанию

В большинстве движков игра опрашивает ввод раз в кадр. Игра на 60 FPS смотрит на твою клавиатуру каждые 16,7 мс; на 240 FPS — каждые 4,2 мс. Это арифметика, а не измерение, и точный тайминг ввода не публикует ни один движок — так что считай это описанием механизма, а не цифрой по конкретной игре.

Практический вывод: подъём низкого фреймрейта укорачивает ожидание на этом этапе, и на 40 FPS тебя ограничивает не клавиатура. Если твой фреймрейт не низкий, а нестабильный, для этого есть Что ищет сканер фризов.

Что осталось и что с этим делать

Страница Fix: по одной карточке восстановления на каждую вещь, которую можно изменить, и каждая возвращает значение Windows по умолчанию.
Страница Fix: по одной карточке восстановления на каждую вещь, которую можно изменить, и каждая возвращает значение Windows по умолчанию.

Короткий и обратимый чек-лист. Отменить можно каждый его пункт, а те пункты, что ведут на карточки Fix, записывают значение Windows по умолчанию независимо от того, какая программа его меняла.

  1. Втыкай клавиатуру в порт на самой машине, а не в хаб монитора, в хаб без питания или в KVM. Каждый из них — ещё один контроллер между устройством и хостом.
  2. Посмотри, что на самом деле делает порт. Страница USB-порты в w0a показывает по каждому устройству интервал опроса, который запросила его прошивка, рядом с частотой отчётов, измеренной по реальному вводу. Устройство, которое просит 1 мс, а выдаёт заметно меньше отчётов, — это проблема линии или драйвера, а не проблема клавиатуры.
  3. Откати старые твики ввода. Мышь, клавиатура и тачпад и Очереди ввода возвращают значения Windows по умолчанию, если их менял более старый инструмент.
  4. Не давай управлению питанием USB усыплять порт, если клавиатура тормозит на первом нажатии после паузы. Это карточка Настройки питания USB-портов.
  5. Сначала измерь, потом решай. Снимай Тест задержки до и после каждого изменения. Изменение, которого не видно в измерении, — это изменение, которое надо откатить.

Чего программа здесь не может

Что она может — убрать зависший перехватчик, показать драйвер, удерживающий ядро, и не дать порту уснуть. На здоровой машине в сумме это меньше, чем люди надеются; на больной — это вся разница. Какая машина у тебя, выясняется измерением.

Похожие статьи

Из примерно дюжины этапов между кликом и сменой пикселя программе принадлежат три, остальное принадлежит прошивке, монитору и игре: Как уменьшить input lag в CS2 и других играх: что может программа, а что нет

w0a не меняет ни одной настройки Windows, пока ты не попросишь, а твик сохраняет старое значение, прежде чем записать новое. Сообщить мне

Эта страница помогла?

Чего не хватило или что не сработало? Мы читаем каждый такой ответ.

Если эта страница не решила проблему, напиши нам — скажи, какую статью ты читал, и мы её исправим.