web-dev-qa-db-fra.com

Les WebSockets conviennent-ils aux jeux multijoueurs en temps réel?

Je suis intéressé par la construction d'un petit jeu multijoueur en temps réel, utilisant HTML5/JavaScript pour le client et probablement Java pour le logiciel serveur.

J'ai un peu cherché WebSockets, mais il semble que j'avais des idées fausses sur ce que sont réellement les WebSockets. Au départ, j'avais pensé à WebSockets comme à la manière JavaScript de gérer les sockets TCP, tels qu'ils sont utilisés en Java et dans d'autres langages, mais il semble qu'un processus complet de négociation doit avoir lieu, et chaque transmission comprend beaucoup de HTTP les frais généraux (et dans ce cas, les avantages par rapport à Ajax ne semblent pas aussi excitants qu’au premier abord)?

Sur un sujet connexe, existe-t-il de meilleures alternatives aux WebSockets à cet effet (jeux multijoueurs en temps réel en JavaScript)?

36
Josh1billion

Les WebSockets sont la meilleure solution pour les jeux multijoueurs en temps réel exécutés dans un navigateur Web. Comme indiqué dans les commentaires, il existe une liaison initiale au cours de laquelle la connexion HTTP est mise à niveau, mais une fois la connexion établie, WebSockets offre le mécanisme de connexion avec le temps de latence le plus bas pour la communication bidirectionnelle entre un serveur et un client.

Je vous recommande de regarder ceci: https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.be

Jettes un coup d'oeil à:

La seule solution brute TCP consisterait à utiliser un plug-in prenant en charge une sorte d'objet TCPClient. Je vous recommande d'essayer WebSockets.

Vous pouvez trouver un certain nombre d'options ici . Il suffit de rechercher WebSockets dans la page.

Jetez également un coup d'œil à WebRTC . Selon l'objectif de votre jeu et si vous avez besoin de votre serveur pour gérer l'état du jeu, vous pouvez utiliser cette technologie pour la communication entre homologues. Vous aurez peut-être encore besoin d’une solution pour gérer l’inclusion de joueurs dans des groupes - dans ce cas, WebSockets est la solution la plus rapide/la meilleure.

33
leggetter

Je ne sais pas si WebSockets reste le meilleur outil de réseautage Multijoueur en temps réel de nos jours (2017). WebRTC est une technologie plus récente Qui offre un potentiel de performances bien supérieur. Et ces Jours, WebRTC est également plus facile à utiliser grâce aux bibliothèques suivantes:

  • node-webrtc simplifie la mise en réseau côté serveur
  • webrtc-native qui fournit également une bibliothèque côté serveur et pourrait être plus rapide que son nom l'indique
  • electron-webrtc fournit une implémentation qui convient parfaitement si vous souhaitez conditionner votre jeu avec electron

Si vous souhaitez éviter les détails de la mise en œuvre réseau et rechercher une bibliothèque offrant une interface multijoueur de niveau supérieur, consultez Lance.gg . (disclaimer: je suis l'un des contributeurs).

8
Gary Weiss

Pour les jeux multijoueurs, le serveur doit envoyer des instantanés périodiques de l'état de la planète au client. Dans le contexte d'une application HTML/js de navigateur, vous avez peu de choix: interroger, websocket ou écrire votre propre plug-in pour étendre les capacités du navigateur.

Les interrogations HTTP telles que BOSH ou Bayeux sont sophistiquées mais introduisent une surcharge du réseau et une latence. Le Websocket a été conçu pour surmonter leurs limites et est nettement plus réactif.

Les bibliothèques, telles que cometd ou socket io , fournissent une abstraction du transport et résolvent les problèmes de compatibilité de navigateur. De plus, cela permet de basculer entre les transports sous-jacents et de comparer leurs performances sans effort. 

J'ai codé un jeu d'arcade multijoueur avec socket.io et mesure habituelle une latence de 2 ms avec un WebSocket et environ 30 ms avec une scrutation XHR sur LAN. C'est assez pour les jeux multijoueurs.

Je vous suggère de regarder nodejs et socket.io afin de pouvoir partager le code entre le client et le serveur, vous devez également emprunter du code multijoueur à [ 3 ].

7
Pierre

En gros, vous avez 3 options au moment d'écrire ces lignes:

WebSockets

WebSockets est un protocole de messagerie léger qui utilise TCP, plutôt qu'une implémentation Javascript de sockets TCP, comme vous l'avez indiqué. Toutefois, au-delà de la prise de contact initiale, aucun en-tête HTTP n'est transmis au-delà de ce point. Une fois la connexion établie, les données passent librement, avec un minimum de temps système.

Long-polling

En résumé, la longue interrogation implique que le client interroge le serveur à la recherche de nouvelles informations périodiquement à l'aide de requêtes HTTP. Ceci est extrêmement coûteux en termes de processeur et de bande passante, car vous envoyez à chaque fois un nouvel en-tête HTTP lourd. C’est essentiellement votre seule option pour les navigateurs plus anciens, et des bibliothèques telles que Socket.io utilisent l’interrogation longue comme solution de secours dans ces cas.

WebRTC

En plus de ce qui a déjà été mentionné, WebRTC permet la communication via UDP. Le protocole UDP est utilisé depuis longtemps dans les jeux multijoueurs dans des environnements non basés sur le Web en raison de sa faible surcharge (par rapport à TCP), de sa faible latence et de sa nature non bloquante.

TCP "garantit" que chaque paquet arrivera (sauf en cas de panne réseau catastrophique) et qu’il arrivera toujours dans l’ordre dans lequel il a été envoyé. Ceci est idéal pour les informations critiques telles que l'enregistrement de scores, de hits, de discussions en ligne, etc.

UDP, en revanche, ne dispose pas de telles garanties. Les paquets peuvent arriver dans n'importe quel ordre, ou pas du tout. C'est en fait utile lorsqu'il s'agit de données moins critiques qui sont envoyées à une fréquence élevée et qui doivent arriver le plus rapidement possible, telles que les positions des joueurs ou les entrées. La raison en est que les flux TCP sont bloqués si un seul paquet est retardé pendant le transport, ce qui entraîne des écarts importants dans les mises à jour de l'état du jeu. Avec UDP, vous pouvez simplement ignorer les paquets qui arrivent en retard (ou pas du tout) et continuer avec le prochain que vous recevez, créant ainsi une expérience plus fluide pour le joueur.

Au moment d'écrire ces lignes, les WebSockets sont probablement votre meilleur choix, bien que l'adoption de WebRTC se développe rapidement et puisse même être préférable au moment où vous avez terminé votre jeu, c'est donc un élément à prendre en compte.

4
Josh Langley

Si vous envisagez d'utiliser JavaScript pour votre jeu (comme vous l'êtes), WebSocket est le meilleur choix pour vous. Et si vous souhaitez prendre en charge l'ancienne version d'Internet Explorer, pensez au système Signal R développé par Microsoft. Ils utilisent WebSocket sous le capot, mais ils disposent également de quelques options de secours ... Le protocole utilisera donc la meilleure solution disponible.

http://signalr.net/

0
MilanG