web-dev-qa-db-fra.com

TCP ou UDP pour un jeu multijoueur?

C'est une question que je vois beaucoup. La plupart des gens disent que UDP est toujours meilleur pour les jeux en temps réel que TCP. Ma compréhension est que TCP essaie de renvoyer des paquets encore et encore jusqu'à ce que l'autre côté les reçoive alors qu'UDP s'en fiche.

La plupart des choses que j'ai lues est que UDP est un must pour tout jeu en temps réel et TCP est terrible. Mais le fait est que la plupart des gens semblent implémenter une certaine forme de TCP en plus de UDP de toute façon. Et j'ai également entendu que la différence entre les deux est négligeable étant donné que nous ne sommes plus dans les années 80 et que l'Internet est maintenant assez rapide et fiable.

Ma compréhension générale ici est-elle fausse? Quelqu'un peut-il clarifier cela pour moi?

19
flooblebit

Cela dépend si vous parlez d'égal à égal, de client/serveur avec les utilisateurs exécutant le serveur ou de client/serveur avec un centre de données exécutant le serveur. Ce n'est que dans ce dernier cas que l'Internet est vraiment rapide et fiable. Les ordinateurs de vos utilisateurs sont pas garantis pour être rapides et certainement pas fiables.

UDP vous permet un meilleur contrôle sur le type d'implémentation de type TCP que vous effectuez. Il vous donne une plus grande flexibilité pour exécuter des paquets dans le désordre, éliminer les paquets que vous considérez inutiles tout en réessayant les paquets que vous jugez importants, ce genre de chose. Mais cela ne devrait être fait qu'en cas de besoin et si vous avez l'expertise nécessaire.

Si vous pouvez vous passer de cette flexibilité, TCP fonctionne assez bien et vous fait gagner beaucoup de temps. Même les studios professionnels (comme celui où j'ai travaillé) utilisent TCP = s'ils n'ont pas absolument besoin d'UDP, et qu'ils ont des personnes dédiées à la programmation réseau.

12
Kevin Fee

Ce serait une supposition de dire "Internet est maintenant assez rapide et fiable" comme l'a souligné @Ordous, et dangereux aussi.

La raison pour laquelle le protocole personnalisé UDP + pour les paquets critiques pour la livraison fait de la magie sur la plupart des jeux est que, il y a des moments où cela pourrait être "correct" si vous perdez un paquet (juste pour, par exemple, des événements secondaires non critiques pour terminer le jeu) , il y a aussi des moments où il est "pas du tout d'accord" de perdre des données pour par exemple le mouvement du curseur, etc. (je ne fais pas de développement de jeux pour gagner ma vie, alors pardonnez mes exemples vagues)

UDP ne perd pas de temps à les pousser encore et encore, par défaut.

Et, de nombreux jeux semblent d'ailleurs avoir les paquets "ok pour perdre parfois" plus que "doivent toujours livrer sans échec". D'où un ajustement naturel pour cette tâche.

Tout ce qui était nécessaire sur UDP était d'utiliser un protocole personnalisé qui aide simplement à fournir correctement les paquets "toujours nécessaires pour livrer sans échec", laissant le reste des données du jeu à la merci de la connexion réseau.

Maintenant, décider du type de trafic qui compose la plupart de VOS données à transmettre vous aidera à mieux décider.

Le point contre TCP serait que le temps passé sur les tentatives pourrait plutôt être consacré à l'envoi de paquets qui comptent MAINTENANT.

Il y a également une chance que s'il y a un problème pendant la transmission, TCP pourrait se répercuter sur un scénario de jeu plus détaillé pour l'utilisateur, gâchant ainsi son expérience par rapport à UDP + Custom Stack (This la dernière partie est juste intuition. Je laisserai cela à d'autres experts ici pour commenter cela. J'adorerais en savoir plus sur les possibilités de ce scénario).

3
Naresh Kumar