Jeu multijoueur avec JavaScript backend et frontend. Quelles sont les meilleures pratiques?
Je pense à la création d'un site web de jeu multijoueur en Node.js. Cela signifie que je vais être en utilisant la même langue dans le backend et le frontend. Il serait en temps réel et d'environ 20 personnes max dans chaque chambre, donc j'ai quelques réflexions:
-
Comment puis-je compenser le délai entre tous les utilisateurs, de sorte que tout le monde voit la même chose en même temps? Je pense que je vais le suivi de la moyenne du temps de réponse de chaque joueur, trouver la plus lente, et en informer les autres clients de la durée (en millisecondes) ils doivent être retardée de chacun afin que tout le monde il est synchronisé que possible.
-
Je pense à l'exécution de code du jeu dans le backend ainsi que dans le frontend (puisque c'est le JavaScript sur les deux extrémités), et se contenter d'un mécanisme de correction d'erreurs de synchronisation avec le "vrai jeu" dans le backend. De cette façon, le jeu doit s'effectuer en douceur sur le frontend et avec seulement quelques petits problèmes lors de la synchronisation se passe. Également à minimiser frontend JavaScript piratage depuis les tricheurs seraient synchronisés vers le bas à l'arrière-plan de jeu.
-
Devrais-je recevoir des actions du joueur par le biais de la prise (combinaisons de touches), de les informer de tous les autres clients de la les actions des autres joueurs, et en même temps de "jouer" le jeu dans le backend et d'envoyer des informations de synchronisation à chacun de l'ensemble de l'état de jeu à chaque fois dans un certain temps pour les synchroniser?
Qu'en pensez-vous? Il y a plus de trucs que je devrais envisager ou de prêter attention à?
S'il vous plaît poster des idées ou des liens vers de la documentation ou des articles concernant les jeux multijoueurs.
EDIT: elles sont utiles:
- Gaffer sur les Jeux - Très bon articles par Glenn Fiedler sur multijoueur jeu en réseau et de la physique
- Le Quake3 Modèle De Mise En Réseau
- Plus sur quake modèle de mise en réseau peut être trouvé ici: bluesnews.com/abrash/chap70.shtml
Vous devez vous connecter pour publier un commentaire.
1 - est impossible. Vous ne savez pas exactement combien de temps un message pour arriver à un client et ne mesure que vous prenez ne seront pas nécessairement applicables pour le prochain message que vous envoyez. Le meilleur que vous pouvez faire est une approximation, mais vous avez toujours besoin de supposer que les gens vont voir des choses légèrement différentes OU la même chose au temps légèrement différents. Je vous recommande juste de l'envoi de l'état actuel à tout le monde et en utilisant l'interpolation/extrapolation pour lisser le gameplay, de sorte que tout le monde voit le jeu de quelques millisecondes dans le passé, avec le retard variant à la fois entre les joueurs et au fil du temps. En général, c'est rarement un problème de taille. Si vous voulez vraiment mettre en mémoire tampon jusqu'certains anciens membres sur le serveur, vous pouvez interpoler entre eux et d'envoyer des différentes données anciennes pour différentes personnes dans une tentative de synchronisation de ce qu'ils voient, mais combiné avec le côté client de la simulation et de la gigue dans les temps de transmission, vous aurez encore à voir quelques différences entre les machines.
2 - la méthode classique consiste à exécuter la simulation sur le serveur, et envoyer une (petite) état des mises à jour aux clients. Les Clients exécutent généralement leurs propres simulations et avoir une sorte de mélange entre leur propre prédit/interpolée de l'état et de l'autorité de l'état que le serveur est de les envoyer. Toutes les décisions autres que la saisie de l'utilisateur doit être fait côté serveur. En fin de compte la façon dont vous mélangez ces est juste un compromis entre un aspect lisse et précis de l'état donc c'est un cosmétique décision que vous aurez à faire.
3 - le client doit, en règle générale traduire d'une touche à une logique d'action. Votre serveur n'a pas de soins sur les touches. Envoyer cette logique d'action pour le serveur, et il peut les diffuser à d'autres clients si ils en ont besoin. Généralement, si vous n'avez pas besoin de faire quoi que ce soit ici - tout changement causé par l'action sera généralement il suffit de changer l'état de la partie, et vous obtiendrez alors envoyé dans la normale à la diffusion de cet état.
Je ne vais pas répondre à vos points directement parce que les autres réponses faites si bien. Mais, je suggère à la recherche en HTML5, WebSockets, et la Comète qui promettent d'améliorer significativement la performance temps réel. Ces technologies vous permettent de longue durée, les requêtes HTTP, ce qui permet au serveur d'envoyer des données vers le client plutôt que de l'interrogation du client au serveur. Cela peut considérablement accélérer les choses.
Voici quelques ressources qui devraient s'avérer utile:
Celui-ci est très difficile à faire, et je peux voir beaucoup de problèmes avec la synchronisation à "le plus lent'. Pouvez-vous desserrez cette sorte que les clients pourraient être "finalement cohérent"?
Sonne bien.
Je voudrais envoyer des événements d'action de l'avant se termine à l'arrière-plan, ont le backend de modifier le jeu de l'état et de publier jeu de la modification de l'état des événements de nouveau pour les clients, avec beaucoup d'attention afin d'envoyer uniquement les événements requis pour le droit d'abonnés. À ce stade, vous pouvez vous débarrasser de tous les événements qui ne semblent pas correspondre ou qui ressemblent à des faux/hacks.
La meilleure façon est de garder une trace de tous les objets dans un seul endroit, à savoir le serveur. Tout le monde va voir les informations sur les serveurs d'un temps de trajet plus tard qu'il "m'arrive" et que les gens les commandes de prendre un voyage à enregistrer sur le serveur. Il n'y a vraiment aucun moyen de contourner cela. Pour certaines applications, il peut être pratique de simuler votre propre mouvement immédiatement, sans attendre une réponse du serveur, mais ce sera sans aucun doute conduire à un cauchemar avec le calendrier de programmation et les gens vont généralement voir les uns les autres "à la traîne autour de". La détection de Collision est impossible.
Le résultat de tout cela est qu'il y aura une lenteur à partir de quand vous entrez vos commandes jusqu'à ce que vous les voyez ce qui se passe réellement, mais j'espère que les gens vont apprendre à composer avec cela et essayer de saisir leurs commandes un peu plus tôt pour compenser. Avec des connexions lentes rapide jeux en temps réel est tout simplement impossible.
Si vous êtes à la recherche d'un exemple de code pour apprendre, il y a un mode multijoueur en ligne jeu de Pong fait en ActionScript, à côté serveur physique interpolées par les clients.
Que Pong exemple est construit sur la De l'Union de la plateforme, qui est disponible gratuitement jusqu'à 1000 connexions client simultanées.
De l'Union a un client JavaScript cadre, OrbiterMicro (JavaScript Client).
Et vous pouvez écrire votre logique côté serveur en JavaScript aussi, voir Créer de l'espace des Modules avec JavaScript.
(Divulgation complète: je suis le co-fondateur de l'Union.)
Une approche classique consiste à ne pas essayer de forcer tous les clients à exécuter dans le même framerate verrouillé sur le serveur... il est juste moche. Au lieu de cela, envoyer des mises à jour fréquentes de sorte que les clients peuvent mettre à jour à chaque fois qu'ils recevoir une nouvelle mise à jour.
Normalement, un client de prédire comment les choses vont pour de courtes périodes, puis être corrigé par une mise à jour à partir du serveur. Vous pouvez appliquer des corrections trop. Par exemple, si le serveur vous dit "joueur 2 est P déplace à la vitesse V", vous pouvez faire une tentative de savoir quel âge ce message peut être basé sur une récente ping, et de corriger la position de
P
àP + x*D
.J'ai répondu à une autre question qui était semblable à cela en relation avec les problèmes de latence qui va être intéressant à lire, de la synchroniser avec le client le plus lent peut-être pas la meilleure solution, en fonction du jeu.
Autres StackOverflow question: Jeu multijoueur mouvement de synchronisation