Oyunda tuşa basınca neden geç oluyor

Anahtarın kapanmasıyla oyunun tepki vermesi arasındaki gecikme altı aşamadan oluşuyor ve bunların yalnızca ikisi yazılım. Hangilerini kısaltabilirsin, hangilerini kısaltamazsın ve bunları kendi makinende nasıl ayırt edersin.

Parmağınla oyun arasındaki gecikmenin çoğu Windows'ta değil, klavyenin kendisinde. Bir tuş basışı ekranda bir piksel değişene kadar altı aşamadan geçiyor ve yazılımın kısaltabildiği aşama tam olarak iki tane. Buraya klavye gecikmesini ortadan kaldıran bir kayıt defteri değeri aramaya geldiysen dürüst cevap şu: öyle bir değer yok. Ama altı aşamanın üçünde gerçek ve kontrol edilebilir arızalar oluyor; onlar yirmi dakikanı hak ediyor.

Bu sayfa yolu parçalarına ayırıyor, her parçanın sahibini adıyla söylüyor ve hangi kısımların erişim dışında olduğunu açıkça yazıyor.

Bir tuş basışının gerçekte izlediği yol

AşamaSahibiYazılım kısaltabilir mi?
1. Anahtar kapanır; klavyenin denetleyicisi matrisini tarar ve temasın sıçramasını beklerKlavye firmware'iHayır
2. Klavye, firmware'inin istediği aralıkta USB kesme uç noktasında bir rapor hazır ederKlavye firmware'iHayır
3. Ana denetleyici raporu toplar; kbdhid.sys ve kbdclass.sys yukarı aktarırWindows + yonga seti sürücüsüYalnızca takılan bir sürücüyü yoldan çıkararak
4. Rapor, girdi yolunda oturan filtre sürücülerinden ve alt seviye kancalardan geçerKlavye süiti, makro katmanı, overlayEvet
5. Oyun girdiyi okur — çoğu motorda kare başına bir kezOyunDolaylı olarak, kare hızını yükselterek
6. Kare render edilir, sunulur, taranır ve ekranda yanarGPU, Windows, monitörKısmen — bkz. Hiçbir yazılımın düzeltemediği girdi gecikmesi

Aşama 1 — kimsenin dokunamadığı kısım

Klavye, bir anahtar kapandığı anda sinyal göndermez. Kendi denetleyicisi tuş matrisini döngü hâlinde tarar; bir temas gördüğünde tuşa basıldı demeden önce sıçramanın geçmesini bekler. O bekleme bir firmware sabitidir. Windows'a açılmaz, hiçbir sürücü onu okuyamaz ve makinendeki hiçbir kayıt defteri değeri onu değiştirmez.

Aynı bilgisayarda, diğer bütün değişkenler aynıyken iki klavyenin farklı hissettirmesinin sebebi budur — ve "klavye gecikmesi"nin bu kadar sık yazılım kostümü giymiş bir donanım cevabı çıkmasının da.

Aşama 2 — yoklama aralığını klavye belirliyor, hem de yazılı olarak

Girdi gönderen USB cihazları bunu bir kesme uç noktası üzerinden yapar ve uç nokta tanımlayıcısında bInterval adlı bir alan, ana makinenin ne sıklıkta soracağını bildirir. Microsoft'un bu yapı için verdiği referans hiçbir yoruma yer bırakmıyor: "This value reflects the device's configuration in firmware. Drivers cannot change it."

Aynı sayfa karşılıkları da veriyor. Full-speed bir cihazda bInterval değerinin 1 olması, yoklama periyodunun 1 milisaniyelik tek bir çerçeve olduğu anlamına geliyor — klavyelerin reklamını yaptığı 1000 Hz rakamı bu. High-speed bir cihazda periyot mikroçerçeveyle sayılıyor, milisaniyede sekiz tane, ve formülü Period = 2 ** (bInterval - 1).

Buradan iki sonuç çıkıyor ve bu sayfanın en işe yarar iki cümlesi bunlar:

Bazı klavyeler rapor hızını da düşüren bir uyumluluk modunda geliyor (çoğu zaman "boot protocol" diye etiketlenir ya da 6 tuşluk rollover anahtarına bağlıdır). Windows yavaş sonucuna varmadan önce klavyenin kendi kılavuzuna ya da yapılandırma yazılımına bak.

İnsanların değiştirdiği ama bu işi yapmayan iki ayar

İkisi de her "klavye gecikmesini düzelt" listesinde var. Hiçbiri basıştan oyuna giden yolu kısaltmıyor ve biz sana plasebo satmaktansa bunu söylemeyi tercih ediyoruz.

Tuş tekrar gecikmesi ve hızı. HKCU\Control Panel\Keyboard altındaki KeyboardDelay ve KeyboardSpeed, bir tuşu basılı tuttuğunda ne olacağını belirliyor: karakterin tekrarlamaya başlaması için ne kadar geçmesi gerektiğini ve sonrasında ne hızla tekrarladığını. İlk basış bundan hiç etkilenmiyor. w0a gecikmeyi en kısa kademesine çekebiliyor ve ürünün kendi açıklaması bunun sana ne kazandırdığını söylüyor — daha hızlı bir konsol, sohbet kutusu ve menü; daha hızlı bir atış değil. Önceki bir araç bu değerleri tuhaf yerlerde bıraktıysa Tuş tekrar hızı ve gecikmesi kartı Windows varsayılanlarını geri koyuyor.

Klavye veri kuyruğu boyutu. KeyboardDataQueueSize, kuyruğu boşaltan iş parçacığı bir an duraksarsa sınıf sürücüsünün kaç rapor tutabileceğini belirliyor. Büyük kuyruk, duraksama sırasında daha az rapor düşmesi demek. Hiçbir raporun daha erken gelmesini sağlamıyor ve ürün bunu dipnotta değil kendi arayüzünde söylüyor. Girdi kuyrukları o değerin ne olduğunu ve nasıl geri konacağını anlatıyor.

Herhangi bir sayfa sana kuyruk boyutunu büyütmenin girdi gecikmesini düşürdüğünü söylüyorsa, artık buna inanmamak için yeterince şey biliyorsun. Kuyruk, kayba karşı bir tampondur; kestirme yol değil.

Aşama 4 — gerçekten sana ait olan tek aşama

Normal bir makinede gerçek ve ölçülebilir klavye gecikmesi burada yaşıyor; neredeyse kimsenin bakmadığı aşama da bu.

Tuş basışlarını oyundan önce görmek isteyen her şey kendini girdi yoluna kuruyor: makro motoru olan klavye üreticisi süitleri, yazmaya tepki veren tuş başı aydınlatma servisleri, yayın ve sohbet overlay'leri, ekran kaydediciler, tuş eşleme araçları, erişilebilirlik yazılımları. Her biri bir durak; meşgul ya da donmuş bir durak da bütün yolu tutuyor.

Windows'un tam bu durum için bir zaman aşımı var. Alt seviye bir kanca LowLevelHooksTimeout milisaniye içinde yanıt vermezse Windows onu atlayıp yoluna devam ediyor; Windows 10 1709 ve sonrası, değer ne kadar büyük olursa olsun en fazla 1000 ms kullanıyor. Değer ayarlı değilken Windows'un ne kadar beklediği belgelenmemiş, biz de ölçmedik. w0a'nın Regedit Tweakleri sayfasında bu beklemeyi 1000 ms'ye ayarlayan bir madde var; HKCU\Control Panel\Desktop altına LowLevelHooksTimeout yazıyor.

Bunu dürüstçe oku: zaman aşımını sınırlamak sağlıklı bir kancayı hızlandırmıyor. Bir kanca zaten bozulduğunda donmayı kısaltıyor. Bu değerli bir şey, ama bir gecikme azaltması değil.

Sırayla ne yapılacak:

  1. Klavyenin kendi yazılımını tamamen kapat — sistem tepsisine küçültmek sayılmaz. Uygulamadan çık, sonra bir tur oyna.
  2. Overlay'leri teker teker kapat: oyun platformunun overlay'i, sesli sohbet overlay'i, kayıt yazılımı, ekran kartı üreticisinin overlay'i.
  3. His değişiyorsa cevabını buldun; artık hangi özelliğin hangi gecikmeye değdiğine sen karar verebilirsin.
  4. Hiçbir şey değişmiyorsa burada aramayı bırak. Aşama 3'e geç.

Aşama 3 — klavyenin ihtiyaç duyduğu çekirdeği tutan bir sürücü

Klavye raporu bir kesme olarak geliyor. Alakasız bir sürücü o işlemci çekirdeğinde bir kesme ya da ertelenmiş çağrı içinde oturuyorsa tuş basışın bekliyor — üstelik sistemdeki her iş parçacığı önceliğinin üstünde bekliyor, yani hiçbir kare süresi grafiğinde ve hiçbir görev yöneticisinde görünmüyor.

Bu ölçülebilir bir şey ve yolun, kendi makinende bir sayı koyabildiğin tek parçası:

  1. w0a'da Gecikme Testi sayfasını aç.
  2. Başlat'a bas ve 12 saniye boyunca fareyi hareket ettirmeye devam et — test, girdi yolunu örneklemek için trafik olarak fareyi kullanıyor.
  3. En uzun sürücü kesintisi değerini ve altındaki sürücü listesini oku; liste en uzun tutuşa göre sıralı ve dosya adını yazıyor.
  4. 1 ms ve üstündeki her şey rapor kaydırıyor. 4 ms ve üstündeki her şey, başka her şeyden önce düzeltilecek şey.

Bir çekirdeği tutan sürücü için önce denenecek çözüm, o sürücüyü donanım üreticisinden güncellemektir. Gecikme testini okumak renkleri, daha da işe yarar biçimde de o sayının bilerek neyi dışarıda bıraktığını anlatıyor.

Aşama 5 — oyun girdiyi kendi takvimine göre okuyor

Çoğu motorda oyun girdiyi kare başına bir kez örnekliyor. 60 FPS'te koşan bir oyun klavyene 16,7 ms'de bir bakıyor; 240 FPS'te 4,2 ms'de bir. Bu bir ölçüm değil, aritmetik — ve hiçbir motor kendi tam girdi zamanlamasını yayımlamıyor; yani bunu oyun başına bir rakam olarak değil, mekanizma olarak al.

Pratik sonucu şu: düşük bir kare hızını yükseltmek bu aşamadaki beklemeyi kısaltıyor ve 40 FPS'te seni sınırlayan şey klavyen değil. Kare hızın düşük değil de kararsızsa, doğru sayfa Takılma taraması neye bakıyor.

Geriye ne kalıyor, onunla ne yapılır

Fix sayfası: değiştirilebilen her şey için bir onarım kartı, her biri Windows varsayılanını geri koyuyor.
Fix sayfası: değiştirilebilen her şey için bir onarım kartı, her biri Windows varsayılanını geri koyuyor.

Kısa ve geri alınabilir bir kontrol listesi. Buradaki her şey geri alınabiliyor; aşağıdaki bağlantıların gösterdiği kartlar ise değişikliği hangi araç yapmış olursa olsun Windows varsayılanını geri yazan Fix kartları.

  1. Klavyeyi makinenin kendi portuna tak — monitör hub'ına, beslemesiz bir hub'a ya da KVM'e değil. Bunların her biri, cihazla ana makine arasına giren bir denetleyici daha demek.
  2. Portun gerçekte ne yaptığına bak. w0a'nın USB Portları sayfası her cihazı, firmware'inin istediği yoklama aralığıyla gerçek girdiden ölçülen rapor hızını yan yana koyarak listeliyor. 1 ms isteyip bunun çok altını teslim eden bir cihaz, klavye sorunu değil bağlantı ya da sürücü sorunudur.
  3. Eski girdi tweaklerini geri al. Daha eski bir araç bunları değiştirdiyse Fare, klavye ve touchpad ve Girdi kuyrukları Windows varsayılanlarını geri koyuyor.
  4. USB güç yönetiminin portu uyutmasını engelle — klavyen bir aradan sonraki ilk basışta ağırsa. Aradığın kart USB port güç ayarları.
  5. Önce ölç, sonra karar ver. Her değişiklikten önce ve sonra Gecikme Testi'ni çalıştır. Ölçümde göremediğin bir değişiklik, geri alman gereken bir değişikliktir.

Yazılımın burada yapamadıkları

Yapabildikleri şunlar: takılan bir kancayı yoldan çıkarmak, bir çekirdeği tutan sürücüyü görünür kılmak ve bir portun uykuya gitmesini engellemek. Sağlıklı bir makinede bunların toplamı insanların umduğundan az tutuyor; hasta bir makinede ise farkın tamamı bunlar. Hangi makineye sahip olduğunu ölçerek öğreniyorsun.

İlgili

Bir tıklamayla pikselin değişmesi arasındaki yaklaşık on iki aşamanın üçü yazılıma ait; kalanı firmware'in, ekranın ve oyunun: Input lag nasıl azaltılır: yazılım neyi kısaltabilir, neyi kısaltamaz

w0a sen istemeden hiçbir Windows ayarını değiştirmez; bir optimizasyon yeni bir değer yazmadan önce eskisini kaydeder. Haber al

Bu sayfa yardımcı oldu mu?

Eksik olan neydi, ya da ne işe yaramadı? Bunların hepsini okuyoruz.

Bu sayfa sorununu çözmediyse bize yaz — hangi makaleyi okuduğunu da ekle, o makaleyi düzeltelim.