Principes de conception de jeux multi-joueurs en temps réel pour Node.js

12

J'ai lu l' article de Valve sur la mise en réseau multi-joueurs qui a été adapté du document de Yahn Bernier de 2001 intitulé Latency Compensating Methods in Client / Server In-game Protocol Design and Optimization . Je fais un jeu multi-joueurs en temps réel en utilisant un serveur node.js connecté aux clients via socket.io et j'ai quelques questions concernant les principes détaillés ci-dessous:

Interpolation d'entité

[Interpolation] empêche le mouvement nerveux que cela entraînerait normalement en tamponnant les mises à jour du serveur puis en les relisant avec les espaces interpolés en douceur entre les deux. Il peut également protéger contre les problèmes causés par la perte de paquets.

Prédiction côté client

La prédiction est la notion du client prédisant les effets des actions du joueur local sans attendre que le serveur les confirme. L'état prévu d'une entité est testé par rapport aux commandes du serveur à mesure qu'elles arrivent jusqu'à ce qu'une correspondance ou une mauvaise correspondance soit détectée.

Compensation de retard

La compensation de décalage est la notion selon laquelle le serveur utilise la latence d'un joueur pour rembobiner le temps lors du traitement de [saisie utilisateur], afin de voir ce que le joueur a vu lorsque la commande a été envoyée. En combinaison avec la prédiction, la compensation de décalage peut aider à combattre la latence du réseau au point de presque l'éliminer du point de vue d'un attaquant.

  • Les principes s'appliquent-ils à TCP comme ils le font à UDP et y aurait-il des différences de mise en œuvre? Je peux voir que l'interpolation d'entité n'aurait pas besoin de se protéger contre la perte de paquets mais c'est à ce sujet.

  • Puis-je même communiquer entre un serveur et un navigateur Web et vice-versa en utilisant UDP et Node.js?

  • Puisque le document a plus d'une décennie, ces principes sont-ils toujours en vigueur ou d'autres technologies sont-elles apparues?

Toute aide serait très appréciée.

Yoshima
la source
1
Vous n'avez pas réellement besoin d'UDP pour les jeux multijoueurs, contrairement à la croyance populaire. Apprenez des meilleurs; WoW utilise TCP, et je pense que de nombreux autres jeux multijoueurs AAA le font. Les gens suivent simplement les conseils de quelqu'un, puis ils passent les 5 prochains mois à implémenter eux-mêmes une version mauvaise et lente de TCP!
jcora
1
(À moins, bien sûr, que vous soyez certain que vous avez les connaissances et les ressources pour développer un protocole décent au-dessus de l'UDP qui pourrait utiliser ses avantages.)
jcora
1
Aucun jeu AAA FPS n'utilise TCP. C'est vraiment trop lent pour les jeux qui nécessitent une mise à jour en temps réel. Mais comme il n'écrit pas de jeu d'action, il devrait pouvoir s'en tirer avec TCP.
Brendan Lesniak
@Yannbane Ne savait pas que WoW utilise TCP. On dirait que beaucoup de MMO le font, d'après ce que j'ai pu trouver. Me rend beaucoup plus confiant sur l'écriture de jeux multijoueurs avec HTML5. Merci!
dreta

Réponses:

6
  • Les principes de réduction des effets des retards sont les mêmes quel que soit le protocole de transport. La perte de paquets est un autre sujet - pour de nombreux types de paquets, la perte de certains n'est pas critique car la prochaine mise à jour est probablement déjà en cours - ici UPD a l'avantage, mais lorsque vous devez vous assurer qu'un certain paquet est livré, vous avez besoin de personnalisation code de reconnaissance pour le faire avec UDP
  • Node.js prend en charge UDP, mais pas les navigateurs Web (sans plugins). La meilleure méthode en temps réel pour communiquer entre les deux est Web Sockets, qui est essentiellement TCP. Mais pour la communication, vous voudrez peut-être utiliser Socket.IO, qui fournit des solutions de secours pour les navigateurs qui ne prennent pas en charge les sockets Web.
  • Les principes restent les mêmes.
Tapio
la source
1
Je suppose que c'est obsolète - WebRTC devrait être le moyen d'utiliser une communication de type UDP, n'est-ce pas?
Nikolay Tsenkov
4

Vous devriez consulter cet article sur les jeux multijoueurs en temps réel en HTML5 publié sur le site buildnewgames.com par Sven Bergstrom, il parle des mêmes choses et il utilise Node.JS. J'ai moi-même quelque chose de similaire. Je suis juste en train de faire des recherches sur la prédiction et l'interpolation côté client, etc., avant d'essayer de résoudre le reste.

Je crois qu'il est certainement possible de le faire avec Socket.IO et Node, mais la technologie est encore nouvelle, donc il y aura peu de documentation et peu ou rien de guides sur la mise en œuvre. Je recommanderais de faire ce que je fais et d'étudier le sujet en détail dans des termes abstraits de haut niveau, puis d'essayer de le mettre en œuvre vous-même.

Cory Gross
la source
1

Je crois que la technologie est à peu près la même. En outre, les concepts ne dépendent pas de la langue que vous utilisez ou de l'utilisation d'UDP ou de TCP. J'ai écrit une explication très détaillée de l'ensemble ici http://www.gabrielgambetta.com/fpm1.html , y compris de jolis diagrammes :)

ggambett
la source