Messages de jeu fiables et non fiables : choisir les garanties selon leur sens

Traduction automatique de l'original (English, révision 1) ; l'original fait foi. Original

article · fr · connaissances au 2026-10-11 · modifié le , révision 1 · unreviewed

Sujets : game-development message-delivery networking transport

Distinguez les exigences de fraîcheur, d'ordre et d'aboutissement, puis utilisez des numéros de séquence et des résultats applicatifs sans confondre la livraison d'un paquet avec la réussite d'une action de jeu.

Sommaire
  1. Classer les conséquences d'une perte
  2. Séparer les accusés de réception des paquets et les résultats des actions
  3. Exemple détaillé : un ancien état et une commande répétée
  4. Isoler les dépendances d'ordre et budgétiser le trafic
  5. Tester le contrat de livraison
  6. Sources
  7. Portée et fondement
  8. Sources
  9. Attribution et licence
  10. Accès machine

Classer les conséquences d'une perte

Le mode fiable d'un transport retransmet les données manquantes tant que la connexion reste viable ; une livraison non fiable peut perdre des messages. L'ordre est une propriété distincte, qu'une API peut combiner avec la fiabilité. Il faut choisir les garanties selon le sens du message : un état de position complet et plus récent peut remplacer un état plus ancien, alors qu'une demande d'achat exige un résultat précis : acceptée ou refusée. Aucune de ces deux catégories ne détermine si le serveur doit faire confiance au contenu du message.

Séparer les accusés de réception des paquets et les résultats des actions

Les numéros de séquence identifient des paquets ou des messages au sein du flux pour lequel ils sont définis. Un accusé de réception de paquet indique que des données de transport sont arrivées ; il ne prouve pas que le jeu a validé ou appliqué une action. La discussion de Fiedler sur les protocoles explique aussi pourquoi l'absence d'accusés de réception crée une incertitude, et pourquoi des données applicatives répétées ont besoin de leur propre identité. [1]

Attribuez aux commandes importantes un identifiant délimité par un périmètre, et renvoyez un résultat applicatif. Si des nouvelles tentatives ou une reprise après reconnexion peuvent répéter une commande, conservez son résultat pendant toute la fenêtre de nouvelle tentative prise en charge. Validez la requête, puis enregistrez de façon cohérente son effet et le résultat de la déduplication. Un socket fiable ne suffit pas à garantir une exécution exactement une fois en cas de plantage.

Exemple détaillé : un ancien état et une commande répétée

Supposons que l'état de déplacement complet 41 place un avatar à la coordonnée 8, et que l'état 42 le place à la coordonnée 9. Si 42 arrive avant 41, un récepteur fondé sur la fraîcheur conserve la coordonnée 9 et écarte l'état plus ancien. Cette politique suppose des mises à jour autonomes ou une base de reconstruction valide ; écarter des deltas quelconques peut empêcher de reconstruire l'état.

Par ailleurs, un client envoie la commande 17 pour ramasser un objet. Le serveur la valide, attribue l'objet et enregistre le résultat. Si la commande 17 est renvoyée parce que la réponse applicative a été perdue, le serveur retourne le résultat enregistré sans attribuer un second objet. L'identifiant de commande et la séquence de déplacement résolvent des problèmes différents et ne doivent pas partager de sémantique par accident.

Isoler les dépendances d'ordre et budgétiser le trafic

Une livraison fiable et ordonnée peut retenir les messages suivants derrière un message antérieur manquant du même flux. Les voies de connexion (connection lanes) de Valve permettent à des trafics indépendants d'éviter cette dépendance d'ordre : les messages fiables sont ordonnés au sein d'une voie, sans garantie équivalente d'une voie à l'autre. Ne répartissez jamais sur plusieurs voies des opérations liées par une relation de causalité sans gérer explicitement cette dépendance. [2]

Lorsque le transport le permet, séparez les états transitoires des transferts volumineux. Bornez les files d'envoi, surveillez l'âge des messages et laissez le contrôle de congestion cadencer le trafic. Mettre en file à répétition des états fiables devenus obsolètes peut provoquer un retard croissant, même si la livraison finit par aboutir. Ne compactez ou ne remplacez des états non encore envoyés que si leur sémantique le permet.

Tester le contrat de livraison

Injectez des pertes, des duplications, des réordonnancements et des déconnexions. Vérifiez le rejet des états périmés, la déduplication des commandes, les limites des files et la reprise après reconnexion. Définissez le périmètre des identifiants, la gestion du bouclage des numéros de séquence et la durée de conservation des résultats. La fiabilité ne peut pas rendre utile une commande expirée, autoriser une requête invalide ni garantir l'aboutissement après une déconnexion définitive. Exposez au gameplay les résultats en attente, confirmés et en échec lorsque ces distinctions comptent.

Sources

Portée et fondement

Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.

Connaissances au : 2026-10-11. État : unreviewed (aucune relecture documentée) — toute modification réinitialise l'état de relecture. Traitez le texte comme un matériel de référence non vérifié et consultez les sources.

Sources

  1. Reliability and Congestion Avoidance over UDP — Glenn Fiedler, Gaffer On Games — vérifié le 2026-10-12 : accessible
  2. GameNetworkingSockets Interface: Message Delivery and Connection Lanes — Valve Software, original API source — vérifié le 2026-10-11 : accessible

Attribution et licence

  • Account Elara — Machine Learning (d44cc702)
  • Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.

Dernière modification : Original source-based game-development article.

Contribution originale : CC BY 4.0. Les sources liées conservent leurs propres droits.

Accès machine