Synchronisation multijoueur et recherche de chemin

8

J'ai une interface de type pointer-cliquer sur un client, qui exécute un A * sur le serveur, pour la recherche de chemin.

Le jeu est contrôlé comme un RTS, mais le monde est persistant, donc les joueurs devraient pouvoir rejoindre / quitter à tout moment, et il n'y aura qu'une trentaine d'unités au maximum sur l'écran.

Quelle est la meilleure façon de synchroniser les mouvements du joueur entre le serveur et le client, une fois que j'ai calculé le (s) chemin (s)?

Le serveur doit-il synchroniser les clients à chaque étape / image d'animation? ou peut-il simplement dire au client "aller à la position X, Y" pour chaque nœud sur le chemin et pour chaque joueur en mouvement? Ou est-il préférable de simplement exécuter les minuteries d'animation sur le client et le serveur et de les synchroniser implicitement de cette façon?

À quoi ressemblerait l'échange de données typique pour un mouvement basé sur un chemin?

ÉDITER:

Certains d'entre vous ont suggéré le verrouillage, parce que j'ai dit "RTS", mais le jeu n'est pas un RTS, il a juste le même type d'interface. La grande différence est que je dois pouvoir faire en sorte que les joueurs rejoignent et quittent le jeu à tout moment . Désolé de ne pas être plus précis.

cloudhead
la source

Réponses:

2

Une alternative consiste à rechercher le chemin d'accès sur le client propriétaire de l'unité. Cela a l'avantage de répartir le travail plus uniformément. Un inconvénient de faire tout le cheminement sur le serveur est que le serveur doit tout faire; un inconvénient d'envoyer uniquement des commandes «déplacer vers X, Y» aux clients est que chaque client doit trouver chaque chemin d'accès. Au lieu de cela, à chaque «tick» du cycle de verrouillage, chaque client indique au serveur, littéralement, chacune des étapes suivantes de son unité. Le serveur s'assure que l'unité peut réellement s'y déplacer et déplace l'unité. Étant donné que le client n'a pas toutes les informations (notamment ce que font les unités des autres clients), une commande de mouvement non valide n'est pas traitée comme une erreur. Cela donne un peu de bande passante pour gagner plus de temps pour le calcul des chemins.

Remplacez le serveur par un homologue; cette méthode fonctionne également pour les jeux peer-to-peer, tant que vous vous assurez que l'ordre dans lequel les mouvements d'unité sont considérés est le même sur toutes les machines.

Blecki
la source
1

Les jeux RTS ont généralement une synchronisation avec verrouillage (la synchronisation se produit à chaque image). Dire tous les chemins au client permettrait aux clients piratés d'abuser des informations supplémentaires.

Cloudanger
la source
1

Ni. Les seules choses que vous devez envoyer sont les commandes. Exemple: Ces 20 unités devraient se déplacer vers (X, Y) puis laisser chaque joueur comprendre comment il y parvient. La partie délicate consiste à s'assurer qu'ils font tous exactement la même chose. Pour ce faire, un modèle de verrouillage est utilisé, les liens ci-dessous doivent l'expliquer en détail. En outre, vous ne devez synchroniser que les éléments importants. Tout ce qui ne change pas le gameplay ne doit pas être synchronisé. Les animations dans les jeux RTS sont généralement réservées au côté visuel.

Une autre chose, les jeux RTS ne sont généralement pas client-serveur, mais P2P. De cette façon, l'un des joueurs ne peut pas tricher, car lorsqu'une incohérence est détectée, vous vous déconnectez simplement.

Voici quelque chose pour vous aider à démarrer: http://www.gamasutra.com/view/feature/3094/1500_archers_on_a_288_network_.php http://altdevblogaday.com/2011/07/09/synchronous-rts-engines-and- a-tale-of-desyncs / http://altdevblogaday.com/2011/07/24/synchronous-rts-engines-2-sync-harder/

Peter Ølsted
la source
Le problème est que j'ai besoin que les joueurs puissent rejoindre et partir à tout moment. Le jeu n'est pas un RTS, il a juste une interface similaire.
cloudhead
Si vous avez plus que disons, 50 objets entièrement dynamiques à un moment donné, vous devrez peut-être examiner la mécanique RTS. Votre jeu ressemble-t-il à CIV ou LOL?
Peter Ølsted le
C'est plus comme Diablo, Dungeon Siege ou HoN, mais avec pointer et cliquer. Il ne devrait pas y avoir plus de ~ 20 unités à l'écran au maximum.
cloudhead
1

Une fois le chemin calculé, le serveur utilise simplement ce chemin pour contrôler le personnage. La présence d'un chemin ne fait aucune différence à ce problème - vous envoyez toujours les mêmes données, que ce soit des mises à jour régulières de position ou autre. Habituellement, il est bon d'envoyer des positions régulières (interpolées sur le client pour les lisser) et un message séparé lorsque l'unité s'arrête.

Kylotan
la source
Ok, c'est en quelque sorte ce vers quoi je vais.
cloudhead
1

Dans mon jeu (un jeu de type RPG multijoueur) j'envoie des parties du chemin au client (pour les PNJ à proximité), ie. les 3 positions suivantes et le moment où le PNJ devrait être là. Pour les joueurs, j'envoie simplement la dernière position valide + son horodatage afin que sur le client, je puisse faire un calcul mort (ou quelque chose de plus élaboré si vous le souhaitez).

Cela fonctionne parfaitement, surtout parce qu'il n'y a pas de collisions entre joueurs / PNJ (avec un faible décalage, vous ne remarquez vraiment rien, avec un décalage de 250+ ms, par exemple, vous remarquez la différence si vous pouvez voir les deux écrans (de deux joueurs) ) en même temps, mais ce n'est toujours pas vraiment notable sur «un écran»).

Je dirais donc: optez pour la création de serveurs (validation des positions + horodatages des joueurs et aussi pour l'IA au début, vous pouvez faire un système plus élaboré pour le NPC plus tard sans gros problèmes) + prédiction client.

ps. J'utilise une précision en millisecondes qui fonctionne parfaitement bien, sauf qu'un int signé ne tient que pendant environ 3 semaines avant de devoir redémarrer le serveur.

Vous pouvez également vouloir vérifier la prédiction de temps (c'est-à-dire essayer de se synchroniser aussi étroitement que possible avec le serveur).

Valmond
la source