Je travaille actuellement sur un jeu multijoueur en ligne ac # en temps réel. L'objectif est d'avoir une connexion client / serveur utilisant le protocole UDP. Jusqu'à présent, j'ai utilisé UDP pour les mouvements des joueurs et TCP pour les événements (un joueur qui tire, un joueur qui perd la vie) parce que je dois être sûr que ces données arriveront à tous les joueurs connectés au serveur. Je sais que UDP est dit «non fiable» et certains paquets peuvent être perdus. Mais j'ai lu partout pour ne jamais mélanger TCP et UDP car cela peut affecter la connexion.
La question principale est de savoir comment dois-je organiser mon réseau?
UDP est sans connexion, comment enregistrer qui est qui? Dois-je enregistrer les adresses IP des clients dans une liste?
Dois-je utiliser TCP pour des événements importants ou utiliser UDP? Si je dois utiliser UDP, comment puis-je m'assurer que les données ne seront pas perdues?
En utilisant à la fois TCP et UDP, je dois enregistrer pour chaque joueur leur IP dans une liste (pour UDP) et le TcpClient qui est connecté dans une autre liste (pour UDP). Comment pourrais-je changer cela pour être plus efficace?
Réponses:
UDP a moins de surcharge, mais au prix de perdre des paquets sans le savoir (une partie de la surcharge avec TCP garantit que les paquets perdus sont renvoyés).
Cependant, le gros problème avec l'utilisation d'UDP est qu'il existe de nombreux sites qui bloquent tout le trafic UDP (à l'exception du DNS) car de nombreux administrateurs pensent que c'est une bonne pratique de sécurité.
En outre, ne présumez pas que chacun de vos joueurs aura une adresse IP différente - il existe de nombreuses situations où plusieurs utilisateurs partagent la même connexion Internet, et si les écoliers deviennent accro à votre jeu, vous pouvez parier qu'ils sont probablement va comprendre comment l'installer et l'exécuter pendant les cours au lieu de faire leur travail (et ne préférez-vous pas qu'ils passent ce temps précieux sur votre jeu plutôt que sur quelqu'un d'autre?).
Une fois que votre flux TCP est ouvert, il est toujours assez efficace. La prochaine étape consiste à minimiser la quantité de données que vous envoyez / recevez, et c'est là que la conception du protocole entre en jeu. Si vous envoyez simplement quelques octets pour chaque commande (par exemple, "aller de l'avant") au lieu, par exemple, d'envelopper la même commande dans des centaines d'octets de code XML, votre consommation globale de bande passante réseau sera plus faible ET moins de cycles CPU seront être requis pour traiter les informations (quelques octets sont facilement comparables au démontage et à l'interprétation et à la vérification de la syntaxe d'un gros morceau de XML).
Vous pouvez certainement ouvrir plusieurs flux TCP et les utiliser à des fins différentes, comme un pour les commandes, un autre pour les transferts graphiques, un autre pour le chat audio, etc. De cette façon, si vous transférez un grand graphique qui prend 5 à 10 secondes à télécharger, au moins les mouvements de commande des joueurs ne seront pas en retard car ils seront sur un flux différent (et vous pouvez afficher un sprite par défaut jusqu'à ce que le nouveau sprite soit téléchargé, ce qui est toujours plus amusant que d'attendre).
la source
Ce n'est pas une réponse directe à votre question, mais gafferongames a de très bons articles sur les jeux en réseau: http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about -jeu-réseautage /
la source