Proč mi stisky kláves ve hře přicházejí pozdě

Zpoždění mezi sepnutím spínače a reakcí hry se skládá ze šesti fází a jen dvě z nich jsou software. Které z nich zkrátit můžeš, které ne a jak je od sebe na vlastním počítači poznáš.

Většina zpoždění mezi tvým prstem a hrou sedí v klávesnici, ne ve Windows. Stisk klávesy projde šesti fázemi, než se změní jediný pixel, a software dokáže zkrátit přesně dvě z nich. Jestli jsi sem přišel hledat hodnotu v registru, která odstraní zpoždění klávesnice, poctivá odpověď zní, že žádná taková hodnota neexistuje — ale tři z těch šesti fází mají skutečné, ověřitelné závady, a ty za dvacet minut práce stojí.

Tahle stránka tu cestu rozdělí, u každého dílu pojmenuje majitele a rovnou řekne, které části jsou mimo dosah.

Cesta, kterou stisk klávesy opravdu projde

FázeKdo ji vlastníZkrátí ji software?
1. Spínač sepne; řadič klávesnice projede svou matici a potlačí zákmit kontaktuFirmware klávesniceNe
2. Klávesnice připraví report na svém přerušovacím endpointu USB, v intervalu, o který si řekl její firmwareFirmware klávesniceNe
3. Hostitelský řadič report vyzvedne; kbdhid.sys a kbdclass.sys ho předají výšWindows + ovladač čipsetuJen odstraněním ovladače, který se zasekává
4. Report projde každým filtračním ovladačem nebo nízkoúrovňovým hookem, který sedí ve vstupní cestěSoftware ke klávesnici, makro vrstva, overlayAno
5. Hra si přečte vstup — ve většině enginů jednou za snímekHraNepřímo, zvýšením snímkové frekvence
6. Snímek se vykreslí, odešle k zobrazení, projde obrazovkou a rozsvítí seGPU, Windows, monitorZčásti — viz Zpoždění vstupu, které žádný software nespraví

Fáze 1 — část, na kterou nikdo nedosáhne

Klávesnice neposílá signál ve chvíli, kdy spínač sepne. Její vlastní řadič projíždí matici kláves pořád dokola, a když uvidí kontakt, počká, až doznějí zákmity, teprve pak klávesu prohlásí za stisknutou. To čekání je konstanta ve firmwaru. Windows ji nevidí, žádný ovladač ji nepřečte a nezmění ji žádná hodnota v registru nikde na tvém počítači.

Právě proto můžou dvě klávesnice na tomtéž počítači působit jinak, i když je všechno ostatní stejné, a právě proto je „zpoždění klávesnice“ tak často hardwarová odpověď převlečená za softwarovou.

Fáze 2 — interval dotazování si nastavuje klávesnice, a je to napsané

USB zařízení, která posílají vstup, to dělají přes přerušovací endpoint, a deskriptor toho endpointu nese pole bInterval, které říká, jak často se má hostitel ptát. Vlastní referenční dokumentace Microsoftu k té struktuře je jednoznačná: "This value reflects the device's configuration in firmware. Drivers cannot change it."

Tatáž stránka udává i převod. Na full-speed zařízení znamená bInterval s hodnotou 1 dotazovací periodu jednoho 1milisekundového rámce — tedy těch 1000 Hz, kterými se klávesnice chlubí. Na high-speed zařízení se perioda počítá v mikrorámcích, osmi na milisekundu, podle vzorce Period = 2 ** (bInterval - 1).

Plynou z toho dvě věci a jsou to nejužitečnější věty na téhle stránce:

Některé klávesnice se dodávají v režimu kompatibility (často označeném „boot protocol“ nebo svázaném s přepnutím na 6-key rollover), který zároveň snižuje frekvenci reportů. Než dojdeš k závěru, že jsou pomalé Windows, mrkni do manuálu klávesnice nebo do jejího konfiguračního softwaru.

Dvě nastavení, která lidé mění a která tohle nedělají

Obojí najdeš v každém seznamu „jak opravit zpoždění klávesnice“. Ani jedno nezkracuje cestu od stisku do hry, a my to raději řekneme, než abychom ti prodali placebo.

Prodleva a rychlost opakování kláves. KeyboardDelay a KeyboardSpeed pod HKCU\Control Panel\Keyboard řídí, co se stane, když klávesu držíš: jak dlouho trvá, než se znak začne opakovat, a jak rychle se pak opakuje. Na první stisk to nemá vliv vůbec žádný. w0a umí prodlevu nastavit na nejkratší stupeň a vlastní popis v produktu říká, co si tím koupíš — rychlejší konzoli, chat a menu, ne rychlejší výstřel. Pokud ti tyhle hodnoty nechal na podivných číslech nějaký starší nástroj, karta Rychlost a prodleva opakování kláves vrátí výchozí hodnoty Windows.

Velikost datové fronty klávesnice. KeyboardDataQueueSize určuje, kolik reportů si smí ovladač třídy podržet, když se vlákno, které je odebírá, na okamžik zasekne. Větší fronta znamená míň zahozených reportů během takového zaseknutí. Nezpůsobí, že by kterýkoli report dorazil dřív, a produkt to říká rovnou ve svém vlastním rozhraní, ne v poznámce pod čarou. Vstupní fronty popisují, co ta hodnota je a jak ji vrátit zpátky.

Jestli ti někde nějaká stránka tvrdí, že zvětšení fronty snižuje latenci vstupu, teď už víš dost na to, abys jí nevěřil. Fronta je pojistka proti ztrátě, ne zkratka.

Fáze 4 — jediná fáze, která je opravdu tvoje

Právě tady na běžném počítači bydlí skutečné, měřitelné zpoždění klávesnice, a je to fáze, kterou skoro nikdo nekontroluje.

Cokoli chce vidět tvoje stisky dřív než hra, se nainstaluje do vstupní cesty: firemní balíky ke klávesnicím s makro enginy, démoni podsvícení jednotlivých kláves reagující na psaní, streamovací a chatovací overlaye, nahrávače obrazovky, nástroje na přemapování kláves, asistenční technologie. Každý z nich je jedno přeskočení navíc, a přeskočení, které je zaneprázdněné nebo zaseknuté, drží celou cestu.

Windows mají pro přesně tenhle případ časový limit. Když nízkoúrovňový hook neodpoví do LowLevelHooksTimeout milisekund, Windows ho přeskočí a jdou dál; Windows 10 1709 a novější používají nejvýš 1000 ms, ať je hodnota jakkoli velká. Jak dlouho Windows čekají, když hodnota není nastavená, není zdokumentováno a neměřili jsme to. Stránka Regedit tweaky v w0a má položku, která tohle čekání nastaví na 1000 ms zápisem LowLevelHooksTimeout pod HKCU\Control Panel\Desktop.

Přečti si to poctivě: omezení limitu neudělá zdravý hook rychlejším. Zkrátí zamrznutí ve chvíli, kdy se hook už pokazil. To se hodí mít, a není to snížení latence.

Co s tím tedy dělat, po pořádku:

  1. Zavři úplně vlastní software klávesnice — ne minimalizovat do oznamovací oblasti. Ukonči ho a zahraj si kolo.
  2. Zavírej overlaye jeden po druhém: overlay herní platformy, overlay hlasového chatu, nahrávací software, overlay výrobce grafiky.
  3. Když se pocit změní, máš svou odpověď a můžeš se rozhodnout, která funkce ti stojí za které zpoždění.
  4. Když se nezmění nic, přestaň hledat tady. Přesuň se na fázi 3.

Fáze 3 — ovladač, který drží jádro potřebné klávesnici

Report klávesnice přichází jako přerušení. Pokud na tom jádru procesoru zrovna sedí nějaký nesouvisející ovladač uvnitř přerušení nebo odloženého volání, tvůj stisk čeká — a čeká nad každou prioritou vlákna v systému, takže se neobjeví v žádném grafu časů snímků ani ve správci úloh.

Tohle se dá změřit a je to jediná část cesty, na kterou se dá na tvém vlastním počítači nasadit číslo:

  1. Otevři v w0a Test latence.
  2. Zmáčkni start a celých 12 sekund hýbej myší — myš je provoz, kterým test vzorkuje vstupní cestu.
  3. Přečti si údaj Nejdelší přerušení ovladačem a pod ním seznam ovladačů, který je seřazený podle nejdelšího držení a pojmenuje soubor.
  4. Cokoli od 1 ms výš vytlačuje reporty. Cokoli od 4 ms výš je věc, kterou máš spravit dřív než cokoli jiného.

U ovladače, který drží jádro, zkus jako první aktualizovat ten konkrétní ovladač od výrobce hardwaru. Čtení testu latence vysvětluje barvy a — což je užitečnější — co to číslo záměrně nezahrnuje.

Fáze 5 — hra si čte vstup podle svého vlastního rozvrhu

Ve většině enginů hra vzorkuje vstup jednou za snímek. Hra běžící na 60 FPS se na tvou klávesnici podívá každých 16,7 ms; při 240 FPS každých 4,2 ms. To je aritmetika, ne měření, a žádný engine nezveřejňuje své přesné časování vstupu — takže to ber jako mechanismus, ne jako číslo ke konkrétní hře.

Praktický důsledek je, že zvednutí nízké snímkové frekvence čekání v téhle fázi zkrátí, a že při 40 FPS tě neomezuje klávesnice. Pokud je tvoje snímková frekvence spíš nestabilní než nízká, správná stránka je Co hledá sken trhání.

Co zbývá a co s tím

Stránka Fix: jedna opravná karta na každou věc, která se dá změnit, každá vrací výchozí hodnotu Windows.
Stránka Fix: jedna opravná karta na každou věc, která se dá změnit, každá vrací výchozí hodnotu Windows.

Krátký a vratný seznam. Všechno z toho jde vzít zpátky a body níže, které odkazují na kartu na stránce Fix, zapíšou výchozí hodnotu Windows bez ohledu na to, který nástroj tu změnu udělal.

  1. Zapoj klávesnici do portu přímo na počítači, ne do hubu v monitoru, do nenapájeného hubu nebo do KVM. Každá z těch věcí je další řadič mezi zařízením a hostitelem.
  2. Podívej se, co ten port doopravdy dělá. Stránka USB porty v w0a vypíše u každého zařízení interval dotazování, o který si řekl jeho firmware, vedle frekvence reportů změřené ze skutečného vstupu. Zařízení, které si říká o 1 ms a dodává výrazně míň, má problém s linkou nebo s ovladačem, ne problém s klávesnicí.
  3. Vrať staré vstupní tweaky. Myš, klávesnice a touchpad a Vstupní fronty obnoví výchozí hodnoty Windows, pokud je změnil starší nástroj.
  4. Zabraň správě napájení USB v uspávání portu, pokud je klávesnice po pauze pomalá na první stisk. Přesně to je karta Nastavení napájení portů USB.
  5. Změř, pak se rozhodni. Před každou změnou a po ní si udělej Test latence. Změna, kterou neuvidíš v měření, je změna, kterou máš vrátit.

Co tady software nedokáže

Co dokáže: odstavit zaseknutý hook, ukázat ovladač, který drží jádro, a zabránit uspání portu. Na zdravém počítači to dohromady dá míň, než v co lidé doufají, na nemocném je to celý rozdíl. Který z těch dvou počítačů máš, zjistíš měřením.

Související

Ze zhruba tuctu fází mezi kliknutím a změnou pixelu vlastní software tři, zbytek patří firmwaru, obrazovce a hře: Jak snížit latenci (input lag): co software dokáže zkrátit a co ne

w0a nezmění žádné nastavení Windows, dokud o to nepožádáš, a tweak si před zápisem nové hodnoty uloží tu starou. Upozornit mě

Pomohla ti tahle stránka?

Co chybělo, nebo co nefungovalo? Čteme každou jednu takovou zprávu.

Jestli tahle stránka problém nevyřešila, napiš nám — uveď, který článek jsi četl, a my ten článek opravíme.