Comment gérer les mouvements aléatoires en temps réel avec la prédiction côté client

10

Je construis un jeu multijoueur en temps réel qui exécute la même boucle «physique» sur le client et le serveur. J'utilise un comportement de direction «vagabond» qui est un mouvement aléatoire essentiel. Le client et le serveur génèrent des nombres aléatoires différents lors de l'exécution des algorithmes de dérapage.

Je me demande comment je peux garder un mouvement naturellement aléatoire mais utiliser une constante qui assurera que le client et le serveur parviennent à la même conclusion.

kevzettler
la source
4
Il est facile de générer la même séquence aléatoire à partir d'une séquence de nombres pseudo-aléatoires. Le plus difficile est de synchroniser l'utilisation de cette séquence. Vous devez rendre votre logique de jeu déterministe, non pas dans le sens où vous n'utilisez pas une séquence aléatoire, mais pour utiliser la séquence aléatoire de manière déterministe. Le moyen le plus simple d'y parvenir est généralement d'éviter toute concurrence dans la boucle logique du jeu, mais il est possible d'avoir la concurrence tant que les threads ne dépendent pas du timing et du séquencement du PRNG lors de la demande d'une valeur aléatoire au PRNG. Voici le dragon.
Lie Ryan

Réponses:

14

Vous pouvez utiliser des graines aléatoires . Sélectionnez la même valeur 32 bits dans le serveur et le client (ou le serveur peut l'envoyer au client au démarrage). Utilisez-le comme graine pour le générateur aléatoire. Vous pouvez envoyer des graines réelles du serveur au client avec la mise à jour de l'état du jeu. Si vous ne voulez pas l'envoyer, vous devez être sûr que le client et le serveur génèrent le même nombre de nombres aléatoires par ce générateur aléatoire.

Ce que vous devez savoir avant de décider de ne pas envoyer de semences réelles au client:

  • Vous aurez des problèmes avec l'abattage de caractères sur le client (cela signifie que vous ne traitez pas les personnages dans un brouillard de guerre sur le client). Si vous voulez faire de la sélection des caractères la meilleure décision sera d'envoyer tout l'état des caractères (avec la graine réelle) du serveur au client lorsque le client doit traiter le caractère. Ainsi, le serveur doit décider quand le client doit traiter le caractère et quand ne le doit pas. Assurez-vous d'utiliser des générateurs aléatoires distincts pour chaque personnage.
  • Le même problème sera avec les lods AI.
  • Le nombre aléatoire de ce générateur aléatoire doit être généré uniquement dans la mise à jour avec un delta de temps fixe. Si vous souhaitez utiliser un chiffre aléatoire pour l'interpolation AI avant le rendu, vous devez utiliser un générateur aléatoire séparé (il n'y a pas de rendu sur le serveur, alors ne vous souciez pas de la graine que vous utiliserez).
  • Si vous souhaitez utiliser différentes plates-formes pour le client et le serveur (C ++ et Java, par exemple), vous devez implémenter (ou trouver) un générateur aléatoire multiplateforme. Ce n'est pas un gros problème, car les générateurs aléatoires sont faciles à implémenter.
Kostya Regent
la source
3

Si le serveur et le client sont d'accord sur la graine, la plupart des algorithmes de randomisation afficheront les mêmes valeurs.

Lince Assassino
la source