Conseils pour la communication entre le jeu par navigateur JS et le serveur node.js? [fermé]

7

Je bricolage avec un simple jeu de flyer de grotte basé sur Canvas et je voudrais le rendre multijoueur à terme. Le plan consiste à utiliser Node.js côté serveur.

Les données envoyées consisteraient en la position de chaque joueur, la direction, la vitesse et autres. Les mouvements des joueurs sont une simple physique des forces, donc je devrais pouvoir extrapoler les mouvements avant la prochaine mise à jour du serveur.

Des conseils ou des bonnes pratiques en matière de communication? Je suppose que les sockets Web sont la voie à suivre. Dois-je envoyer des informations à chaque passage de la boucle de jeu ou à des intervalles spécifiés? En outre, cela ne me dérange pas si cela ne fonctionne pas avec les anciens navigateurs.

Petteri Hietavirta
la source

Réponses:

10

J'ai récemment fait un crossover d'astéroïdes / guerres de géométrie avec Node.js / JavaScript:
http://github.com/BonsaiDen/NodeGame-Shooter

Il a un gros serveur qui traite le jeu et des clients légers qui ne sont essentiellement que des vues. Le client fait une interpolation et des choses pour que cela paraisse fluide.

Vous voudrez peut-être consulter ces deux fichiers, qui contiennent la logique de mise en réseau sous-jacente, ainsi que les modèles d'acteur et de client:
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/client/nodegame.client. js
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/server/nodegame.js

L'ensemble du jeu est basé sur des acteurs qui gèrent leurs «événements de mise à jour» (les choses qui sont envoyées aux clients), pour la plupart. Il est également possible de masquer les acteurs d'un client spécifique pour implémenter, par exemple, l'invisibilité.

On peut également enregistrer des jeux et simplement introduire les messages dans le client pour les lire.

En ce qui concerne la technologie: les
WebSockets sont le chemin à parcourir ici. J'ai également fait un encodage binaire personnalisé pour JS qui, tout en abandonnant des choses comme plus de 2 décimales sur les flottants, est environ 50% plus petit que JSON (et est 2x plus rapide sous V8 que l' encodage JSON natif )

Ivo Wetzel
la source
Merci! Ce NodeGame Shooter a l'air assez intéressant, je vais devoir passer un peu de temps avec son code.
Petteri Hietavirta
8

Je suggère de garder les choses à part.

Dans Stendhal qui est un MORPG 2D écrit en Java, nous avons fait les choses suivantes et cela fonctionne très bien:

  • Le client utilise une boucle rapide pour dessiner. Il fait une animation fluide et certaines prédictions pour minimiser le décalage.
  • Le serveur utilise une boucle pour traiter toute la logique du jeu. Dans notre cas, cela peut être beaucoup plus lent que la boucle de dessin. Alors que les clients font des prédictions, le serveur gagne toujours.

La communication entre le client et le serveur se fait à l'aide d'actions et de perceptions:

  • Les actions effectuées par les utilisateurs comme «déplacer vers le haut» sont envoyées au serveur lorsqu'elles se produisent. Le serveur les met en file d'attente et les traite dans sa propre boucle.
  • Les perceptions sont envoyées du serveur au client pour mettre à jour leur vision du monde.

Nous avons fait quelques "trucs" pour gagner des performances supplémentaires:

  • Nous avons deux types de messages de perception: un message complet utilisé lors de la connexion et des joueurs rejoignant une zone. Et des mises à jour incrémentielles utilisées après cela. Cela économise beaucoup de bande passante réseau.
  • Nous divisons les messages de perception en une partie publique et une partie privée: tous les joueurs d'une même zone partagent la même partie publique, ce qui nous fait gagner du temps de traitement car la sérialisation s'est avérée être un goulot d'étranglement sur Java (pas JavaScript).
Hendrik Brummermann
la source
Ah ha! Mettez les actions en file d'attente pour une boucle plutôt que de les traiter au moment de l'appel, exactement ce dont j'avais besoin!
MetaGuru
3

Utilisez socket.io , c'est une bibliothèque d'abstraction WebSockets pratique qui fournit des solutions de rechange pour les navigateurs qui ne la prennent pas en charge.

De plus, si vous optez pour un modèle en ligne comme celui-ci, je recommanderais de déplacer le traitement du jeu sur le serveur. De cette façon, il vous suffit de communiquer les modifications graphiques et les entrées souris / clavier. Cela aide également à prévenir la tricherie.

Stephen Belanger
la source