Kašnjenje

Zašto Dish izgleda kao žica.

Kašnjenje je jedina metrika koja je bitna kod kontrolera. Dish je oko nje izgrađen od prvog dana.

Budžet kašnjenja

Žičani Xbox kontroler pol-uje na 250 Hz na Windowsu. To znači da vaša igra može pročitati pritisak dugmeta do 4 ms nakon što se desio, samo od polling rate-a. Stavite 60 fps frejm na to i najgori slučaj prsta-do-piksela na žičanom kontroleru je oko 20 ms.

Dish je napravljen da skoro ništa ne doda tom budžetu na običnom Wi-Fi 6 LAN-u. Evo gdje svaka milisekunda ode:

Faza Tipično vrijeme
Touch / button događaj se pojavljuje u OS-u < 1 ms
Dish pravi + šifrira 12-byte paket < 0.1 ms
UDP slanje + Wi-Fi airtime + UDP prijem 1–4 ms (5 GHz)
Satellite verifikuje + ubacuje preko ViGEmBus-a < 0.5 ms
Igra pol-uje novo stanje kontrolera 0–4 ms (zavisi od igre)
Frejm prikazan na monitoru 0–16 ms (zavisi od fps)
S kraja na kraj (tipično) ~6–25 ms

Za poređenje, Bluetooth kontroleri obično dodaju 8 do 15 ms preko svojih žičanih braće. Najgori slučaj Dish-a na zdravom LAN-u je otprilike najbolji slučaj Bluetooth kontrolera.

Kako ga držimo čvrstim

  • Bez reda, bez async runtime-a. Handler ulaznog događaja poziva sendto inline. Bez producer/consumer reda, bez event loop skoka, bez Combine, bez Kotlin coroutine. Input thread je network thread.
  • Sirovi UDP. Ne TCP, ne WebSockets, ne gRPC, ne QUIC, čak ni NWConnection na Apple platformama. Sirovi POSIX socketi tako da možemo sami postaviti IP_TOS.
  • DSCP EF označavanje. Odlazni paketi su označeni DSCP klasom EF (0xB8). QoS-svjesni ruteri i access pointi ih preskaču ispred masovnog saobraćaja.
  • Sitni paketi. 12 byte-a payloada, oko 50 byte-a na žici jednom kada su UDP, IP i 802.11 header-i unutra. Jedan Wi-Fi frejm.
  • Nula alokacija na vrućoj putanji. Baferi su na stacku ili preliminarno alocirani. Nikakva GC pauza ne može produžiti slanje paketa.
  • Direktno kernel ubacivanje. Satellite poziva DeviceIoControl direktno u ViGEmBus. Bez DLL marshalling-a, bez IPC-a, bez service round-trip-a. Vruća putanja prijemnika je tri sistemska poziva sa nulom alokacija: recvfrom()memcpy()DeviceIoControl().
  • Time-critical receive thread. Satellite pinuje svoj UDP receive thread na THREAD_PRIORITY_TIME_CRITICAL na Windowsu i na core 0 affinity, tako da raspomahani tab pretraživača ne može gladovati vaše ulaze.

Šta jede kašnjenje u praksi

Svaki „Dish izgleda spor“ izvještaj koji smo vidjeli vodi nazad ka jednom od ovih. Nijedan nije Dish-ova greška, svi imaju rješenje:

  • 2.4 GHz Wi-Fi. Smetnja mikrotalasne pećnice, zagušenje od komšija, niži propusni opseg. Rješenje: stavite i svoj telefon i svoj gaming PC na 5 GHz ili 6 GHz.
  • Wi-Fi power-save na Androidu. Neki Android telefoni odlažu odlazne pakete za 30 do 100 ms kada ekran miruje. Dish drži otkucaj svake 2 sekunde: dovoljno mali da bude besplatan na radiju, dovoljno čest da spriječi OS da uspava Wi-Fi čip.
  • Mesh repetitori. Svaki hop dodaje 1 do 3 ms. Stavite Satellite na čvor koji je žično povezan na glavni ruter ako možete.
  • USB-C dock sa Ethernetom na Thunderbolt hub-u. Neki jeftini dockovi baferuju. Koristite ugrađeni Wi-Fi laptopa ili passthrough adapter umjesto toga.
  • 120 Hz vs 60 Hz. 120 Hz monitor smanjuje najgori dio frame-time-a budžeta na pola. Besplatno 8 ms.

Želite sami mjeriti?

Satellite web UI na localhost:9877 prikazuje uživo RTT po vezi, posljednje mikrosekunde petlje, vršne mikrosekunde petlje, brojače uspjeha i neuspjeha submita, i brojeve odbačenih replay-eva. /debug stranica je pun ispis performansi prijemnika. Ako vidite išta iznad 10 ms RTT na istom Wi-Fi-ju, nešto drugo na vašoj mreži se loše ponaša. Otvorite issue sa screenshotom debug stranice i pomoći ćemo vam da iskopate.