Nous construisons un jeu multijoueur en temps réel, dans lequel chaque joueur est responsable de signaler son état à chaque itération de la boucle de jeu.
Les mises à jour d'état sont diffusées à l'aide d' UDP non fiable .
Pour minimiser l'envoi de données d'état, nous avons mis au point un système qui n'enverra que des deltas (quelles que soient les données d'état modifiées).
Cette méthode est cependant imparfaite, car un paquet perdu signifie que les autres joueurs ne recevront pas le delta, ce qui rendra le jeu inattendu.
Par exemple:
Supposons que cet état se compose de: {positionX, positionY, health}
Frame 1 - positionX changed --> send a packet with positionX only.
Frame 2 - health changed // lost !
Frame 3 - positionY changed --> send a packet with positionY only.
// Les autres joueurs ne connaissent pas le changement de santé.
Comment peut-on alors surmonter ce problème? l'envoi de l'intégralité des données n'est pas toujours possible.
la source
Vous pouvez également contourner le problème en envoyant une mise à jour d'état complète du serveur aux clients, par exemple toutes les secondes. Si un client n'a pas reçu de paquet, il se comportera incorrectement jusqu'à ce qu'il reçoive la mise à jour d'état complète. Ensuite, il sera à nouveau synchronisé.
la source
De nombreux jeux utilisent à la fois UDP et TCP / IP pour envoyer / recevoir des données et selon la fréquence d'envoi des données, un protocole différent est utilisé.
Par exemple:
UDP: mises à jour de position et tout autre élément pouvant potentiellement être envoyé / reçu plusieurs fois par seconde.
TCP / IP: actions d'inventaire, actions de sort / capacité (la plupart des actions effectuées par l'utilisateur)
Cela dépend vraiment de la quantité de trafic de chaque article. Si vous trouvez que vous envoyez des mises à jour HP assez fréquemment, elles doivent peut-être être sur UDP.
la source
Si vous lisez la revue du code source de Quake 3 , il explique le modèle de réseau qui est très similaire à votre conception, mais avec une solution pour les paquets perdus.
Essentiellement, dans votre modèle, vous envoyez des deltas par rapport à l'état directement précédent. Dans le modèle quake3, vous envoyez des deltas par rapport au dernier état acquitté par le pair.
la source