Чому натискання клавіш запізнюються в іграх

Затримка між замиканням перемикача і реакцією гри складається з шести етапів, і лише два з них програмні. Які можна скоротити, які — ні, і як відрізнити одні від одних на власній машині.

Більша частина затримки між твоїм пальцем і грою сидить у клавіатурі, а не у 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."

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

З цього випливають дві речі, і це найкорисніші речення на цій сторінці:

Деякі клавіатури постачаються в режимі сумісності (його часто підписують «boot protocol» або прив'язують до перемикача 6-key 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: що програма може скоротити, а що ні

w0a не змінює жодного налаштування Windows, поки ти не попросиш, а твік зберігає старе значення, перш ніж записати нове. Бути в курсі

Ця сторінка допомогла?

Чого бракувало або що не спрацювало? Ми читаємо кожну таку відповідь.

Якщо ця сторінка не розв'язала проблему, напиши нам — скажи, яку статтю ти читав, і ми виправимо статтю.