Sont les WebSockets adapté pour multijoueur en temps réel des jeux?
Je suis intéressé par la construction d'une petite multijoueur en temps réel de jeu, à l'aide de HTML5/JavaScript pour le client et probablement de Java pour le logiciel serveur.
J'ai regardé dans les WebSockets un peu, mais il semble que j'ai eu des idées fausses sur ce que les WebSockets sont réellement. J'avais d'abord pensé à des WebSockets comme JavaScript de la façon de gérer les sockets TCP, tout comme ils sont utilisés en Java et d'autres langages, mais il semble qu'il y est un entier de handshaking processus qui doit avoir lieu, et chaque transmission comprend beaucoup HTTP généraux (et dans ce cas, les bénéfices de plus de Ajax ne pas sembler aussi excitante que lors d'un premier coup d'oeil)?
Sur un sujet connexe, y at-il de meilleures solutions pour les WebSockets à cet effet (en temps réel multijoueur jeux en JavaScript)?
- En fait, dans chaque transmission contient deux octets de surcharge. Le http poignée de main ne se produit que lors de l'ouverture d'un nouveau websocket et vous pouvez garder le websocket ouvert aussi longtemps que le navigateur reste sur cette page.
- Oui, ils sont. le HTTP poignée de main est fait une fois pour ouvrir le socket. Si la surcharge est importante si vous fermez la prise après un message, et insignifiant si vous gardez le socket ouvert pour toujours.
- Pourquoi est-ce l'établissement de la liaison si compliqué? À partir de ce que je me souviens, on doit lire dans une poignée de chaînes, dont le dernier est une [aléatoire?] collection de caractères qui doit ensuite être encodées en base64, d'une certaine façon et envoyé au client. J'ai essayé d'écrire ledit serveur-côté de la poignée de main de code moi-même, mais il ne fonctionne pas (l'établissement de la liaison, jamais achevée, de sorte que je n'ai jamais été en mesure d'envoyer et de récupérer mes propres paquets). J'ai atteint le même résultat exact lors de l'utilisation d'un package Java quelqu'un d'autre avait écrit pour faire la même chose.
- l'établissement de la liaison n'est pas complexe, un serveur websocket est à environ 100 lignes, je vous recommande de socket.io. Quant à savoir pourquoi? sans doute de sécurité.
- La poignée de main n'est pas compliquée (tools.ietf.org/html/...). L'en-tête de réponse est assez statique (seulement 2 valeurs pour remplir). Il est conçu pour être HTTP-compatible (pour permettre les WebSockets et HTTP/S connexions à arriver sur les mêmes ports). Il ajoute également de la SCRO de sécurité (même Flash sockets faire via l'extérieur de la bande de politique de sécurité de la demande). Le SHA1 accepter de hachage garde un client AJAX de tromper un serveur WebSocket. Remarque il y a une ancienne version de WebSockets qui est très différent, et qui pourrait être à l'origine des problèmes que vous avez vu.
- Une mise à jour des années plus tard: depuis l'affichage de cette question, j'ai eu du succès le développement d'une variété de jeux qui ont utilisé les websockets, à la fois en temps réel et tour par tour. La méthode la plus simple (et à bien des égards le meilleur) technologie de la pile que j'ai trouvé est d'utiliser Node.js pour le serveur, avec la prise.io à la fois le serveur et le client/navigateur. L'établissement d'une connexion est facile, socket.io poignées de la poignée de main et d'autres exigences, et le processus de développement d'ensemble est très agréable. Je n'ai pas eu de problèmes avec le décalage horaire, mais mon seul temps réel websocket jeux étaient de faible trafic.
Vous devez vous connecter pour publier un commentaire.
Les WebSockets sont la meilleure solution en temps réel multijoueur jeux s'exécutent dans un navigateur web. Comme l'a souligné dans les commentaires, il s'agit d'une première poignée de main où la connexion HTTP est mis à jour, mais une fois que la connexion est établie WebSockets offre la plus faible latence de la connexion mécanisme de communication bi-directionnelle entre un serveur et un client.
Je vous recommande de regarder ce: https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.être
Jeter un oeil à:
Le seul raw TCP solution serait d'utiliser un plugin qui prend en charge un certain type d'objet TCPClient. Je vous recommande d'essayer les WebSockets.
Vous pouvez trouver un certain nombre d'options ici. Il suffit de chercher pour les WebSockets l'intérieur de la page.
Aussi jeter un oeil à WebRTC. Selon le but de votre jeu et si vous avez besoin de votre serveur pour gérer l'état de jeu, vous pouvez utiliser cette technologie du peer-to-peer de communication. Vous pouvez toujours besoin d'une solution pour mettre les joueurs dans des groupes - dans ce cas, les WebSockets est la manière la plus rapide/la meilleure solution.
Je ne suis pas sûr si les WebSockets sont toujours le meilleur outil pour la mise en réseau
un multijoueur en temps réel de ces jours (2017). WebRTC est une technologie plus récente
qui offre le potentiel de performance bien plus élevée. Et ces
jours, WebRTC est également plus facile à travailler grâce aux bibliothèques suivantes:
Alternativement, si vous voulez être épargné les détails réels de la mise en réseau mise en œuvre, et vous êtes à la recherche pour une bibliothèque qui offre un plus haut niveau de l'interface multijoueur, jetez un oeil à De Lance.gg. (disclaimer: je suis l'un des contributeurs).
Jeux multijoueur nécessite que le serveur pour envoyer des instantanés périodiques de l'état du monde pour le client. Dans le contexte d'un navigateur HTML/js application que vous avez peu de choix: le sondage, websocket ou écrire votre propre plugin pour étendre les capacités du navigateur.
HTTP interrogation comme BOSH ou Bayeux sont sophistiqués mais introduit la surcharge du réseau et le temps de latence. Le websocket a été conçu pour surmonter leurs limites et n'est certainement plus sensible.
Bibliothèques, comme cometd ou socket io, fournir une abstraction du transport et de résoudre les problèmes de compatibilité navigateur pour vous. En plus de cela, elle permet de basculer entre les sous-jacents des transports et de comparer leurs performances sans effort.
J'ai codé jeu d'arcade multijoueur avec la prise.io et la mesure habituelle 2 ms temps de latence avec un websocket et autour de 30ms avec xhr-interrogation sur lan. C'est assez pour un jeux multijoueurs.
Je vous suggère de jeter un oeil à nodejs et de la prise.io afin d'être en mesure de partager du code entre le client et le serveur, vous avez aussi la voiture emprunter une partie multijoueur code à [Trois].
Fondamentalement, vous avez 3 options au moment d'écrire ces lignes:
WebSockets
WebSockets est un léger protocole de messagerie qui utilise TCP, plutôt que d'un Javascript de mise en œuvre de sockets TCP, comme vous l'avez remarqué. Cependant, au-delà de la première poignée de main, il n'y a pas d'en-têtes HTTP de et bof au-delà de ce point. Une fois la connexion établie, les données transitent librement, avec un minimum de frais généraux.
Le Long du scrutin
Le Long du scrutin, en un mot, le client interrogation du serveur pour que de nouvelles informations régulièrement avec des requêtes HTTP. Ce qui est extrêmement coûteux en termes de CPU et de bande passante, comme vous l'envoyez à une lourde nouvel en-tête HTTP à chaque fois. C'est essentiellement votre seule option quand il s'agit de navigateurs plus anciens et des bibliothèques comme Socket.io utiliser le long du scrutin comme un secours dans ces cas.
WebRTC
En plus de ce qui a été mentionné déjà, WebRTC permet la communication via UDP. L'UDP a longtemps été utilisé dans les jeux multijoueurs en non environnements web en raison de son faible coût (par rapport à TCP), une faible latence, et non de blocage de la nature.
TCP "garanties" que chaque paquet va arriver (sauf pour catastrophiques panne du réseau), et qu'ils seront toujours arriver dans l'ordre qu'ils ont été envoyés. C'est idéal pour des informations essentielles, telles que l'enregistrement des scores, de visites, de chat, et ainsi de suite.
UDP, d'autre part, n'a pas de telles garanties. Les paquets peuvent arriver dans n'importe quel ordre, ou pas du tout. C'est en fait utile quand il s'agit de moins en moins important de données qui est envoyé à une fréquence élevée, et les besoins d'arriver le plus rapidement possible, comme les positions des joueurs ou des intrants. La raison étant que le flux TCP sont bloquées si un seul paquet est retardé pendant le transport, ce qui entraîne de grosses lacunes dans le jeu mises à jour d'état. Avec UDP, vous pouvez tout simplement ignorer les paquets qui arrivent en retard (ou pas du tout), et de continuer avec la prochaine, que vous recevez, la création d'une plus lisse expérience pour le lecteur.
Au moment d'écrire ces lignes, les WebSockets sont probablement votre meilleur pari, bien que WebRTC adoption se développe rapidement, et peut en fait être préférable au moment où vous en avez terminé avec votre jeu, de sorte que c'est quelque chose à considérer.
Si vous êtes le rabotage d'utiliser le JavaScript de votre jeu (comme vous) puis WebSocket est le meilleur choix pour vous. Et si vous voulez prendre en charge les anciennes version d'Internet Explorer alors pensez de Signal R système Microsoft a développé. Ils sont à l'aide de WebSocket sous le capot, mais ils ont aussi un peu retomber options...donc protocole d'utilisation de la meilleure solution disponible.
http://signalr.net/