Pourquoi Dish donne la sensation d'un fil.
La latence est la seule métrique qui compte sur une manette. Dish a été conçu autour d'elle dès le premier jour.
Le budget de latence
Une manette Xbox filaire est interrogée à 250 Hz sur Windows. Cela signifie que votre jeu peut lire une pression de bouton jusqu'à 4 ms après son apparition, rien qu'à cause de la fréquence d'interrogation. Empilez une frame à 60 ips par-dessus et le pire cas doigt-à-pixel sur une manette filaire tombe autour de 20 ms.
Dish a été conçu pour n'ajouter presque rien à ce budget sur un LAN Wi-Fi 6 normal. Voici où va chaque milliseconde :
| Étape | Temps typique |
|---|---|
| L'événement tactile / bouton remonte au système | < 1 ms |
| Dish construit + chiffre un paquet de 12 octets | < 0,1 ms |
| Envoi UDP + temps d'antenne Wi-Fi + réception UDP | 1–4 ms (5 GHz) |
| Satellite vérifie + injecte via ViGEmBus | < 0,5 ms |
| Le jeu interroge le nouvel état de la manette | 0–4 ms (selon le jeu) |
| Frame rendue à l'écran | 0–16 ms (selon le ips) |
| De bout en bout (typique) | ~6–25 ms |
Pour référence, les manettes Bluetooth ajoutent habituellement 8 à 15 ms par rapport à leurs cousines filaires. Le pire cas de Dish sur un LAN sain équivaut grosso modo au meilleur cas d'une manette Bluetooth.
Comment on garde cela serré
- Pas de file, pas de runtime asynchrone. Le gestionnaire d'événements d'entrée appelle
sendtoen ligne. Pas de file producteur/consommateur, pas de saut de boucle d'événements, pas de Combine, pas de coroutine Kotlin. Le thread d'entrée est le thread réseau. - UDP brut. Pas TCP, pas WebSockets, pas gRPC, pas QUIC, même pas
NWConnectionsur les plateformes Apple. Sockets POSIX bruts pour pouvoir réglerIP_TOSnous-mêmes. - Marquage DSCP EF. Les paquets sortants sont marqués DSCP classe EF (0xB8). Les routeurs et points d'accès compatibles QoS les font passer avant le trafic massif.
- Paquets minuscules. 12 octets de charge utile, environ 50 octets sur le fil une fois les en-têtes UDP, IP et 802.11 ajoutés. Une seule frame Wi-Fi.
- Zéro allocation sur le chemin chaud. Les buffers sont sur la pile ou pré-alloués. Aucune pause GC ne peut étirer l'envoi d'un paquet.
- Injection directe en mode noyau. Satellite appelle
DeviceIoControldirectement vers ViGEmBus. Pas de marshalling DLL, pas d'IPC, pas d'aller-retour de service. Le chemin chaud du récepteur, c'est trois appels système sans aucune allocation :recvfrom()→memcpy()→DeviceIoControl(). - Thread de réception temps critique. Satellite épingle son thread de réception UDP à
THREAD_PRIORITY_TIME_CRITICALsur Windows et à l'affinité du cœur 0, pour qu'un onglet de navigateur emballé ne puisse pas affamer vos entrées.
Ce qui mange la latence en pratique
Chaque rapport « Dish me semble laggy » que nous avons vu remonte à l'un de ces points. Aucun n'est la faute de Dish, tous ont une solution :
- Wi-Fi 2,4 GHz. Interférences de micro-ondes, congestion des voisins, plafond de bande passante plus bas. Solution : mettez votre téléphone et votre PC de jeu sur 5 GHz ou 6 GHz.
- Économie d'énergie Wi-Fi sur Android. Certains téléphones Android retardent les paquets sortants de 30 à 100 ms une fois que l'écran reste immobile. Dish maintient un battement de cœur toutes les 2 secondes : assez petit pour être gratuit sur la radio, assez fréquent pour empêcher le système de mettre la puce Wi-Fi en veille.
- Répéteurs maillés. Chaque saut ajoute 1 à 3 ms. Posez Satellite sur un nœud câblé au routeur principal si possible.
- Station d'accueil USB-C avec Ethernet sur un hub Thunderbolt. Certaines stations bon marché bufferisent. Utilisez plutôt le Wi-Fi intégré du portable ou un adaptateur passthrough.
- 120 Hz vs 60 Hz. Un écran 120 Hz divise par deux la tranche du pire frame-time du budget. 8 ms gratuites.
Vous voulez le mesurer vous-même ?
L'interface web de Satellite à localhost:9877 affiche le RTT en direct par connexion, les dernières microsecondes de boucle, les microsecondes de boucle de pointe, les compteurs de succès et d'échec d'envoi, et les compteurs de rejets pour rejeu. La page /debug est le rapport complet de performance du récepteur. Si vous voyez quoi que ce soit au-dessus de 10 ms de RTT sur le même Wi-Fi, c'est qu'autre chose sur votre réseau fait des siennes. Ouvrez une issue avec une capture d'écran de la page de debug et nous vous aiderons à creuser.