Interpoler entre deux états en réseau?

11

J'ai de nombreuses entités du côté client qui sont simulées (leurs vitesses sont ajoutées à leurs positions sur une base par image) et je les laisse se compter. Ils envoient des mises à jour sur l'endroit où ils ont été vus pour la dernière fois et leurs changements de vitesse. Cela fonctionne très bien et d'autres joueurs voient ce travail trouver. Cependant, après un certain temps, ces joueurs commencent à se désynchroniser après un certain temps. C'est à cause de la latence.

Je voudrais savoir comment je peux interpoler entre les états pour qu'ils semblent être dans la bonne position. Je sais où le joueur a été DERNIER vu et sa vitesse actuelle, mais l'interpolation vers le dernier état vu fait que le joueur se déplace réellement vers l'arrière. Je ne pouvais pas du tout utiliser la vitesse pour les autres clients et simplement les «lerp» dans la direction appropriée, mais je pense que cela provoquerait un mouvement irrégulier. Quelles sont les alternatives?

Vaughan Hilts
la source

Réponses:

9

Pour cette raison, vous constaterez que les simulations sont souvent exécutées une ou plusieurs images avant ce qui est en fait rendu à un moment donné sur un client donné. En d'autres termes, ce que vous effectuez peut en fait être l'avant-dernière image, pas la dernière image.

Recherchez dans cet article toutes les instances du mot "à venir" et je pense que vous commencerez à obtenir une image meilleure que je ne l'ai peut-être expliqué ci-dessus.

Ingénieur
la source
D'accord, alors vous sous-entendez que je devrais vraiment rendre le lecteur tel qu'il était il y a 300 ms et interpoler vers le futur? (Dans un état séparé, lorsqu'un nouvel état arrive; cela changerait)
Vaughan Hilts
@VaughanHilts Encore une fois, veuillez lire l'article et les commentaires. Gaffer est un expert dans ce domaine et il l'explique beaucoup plus clairement que moi. Mais l'idée générale est que oui, votre modèle de simulation est en avance tandis que votre rendu est quelque peu en retard pour tenir compte de l'effet que vous avez décrit. Ce n'est en aucun cas le seul endroit où j'ai vu cette technique décrite.
Ingénieur
2

Quand tu dis:

ces joueurs commencent à se désynchroniser après un certain temps

cela me fait penser que votre problème peut avoir plus à voir avec le décalage de vos horloges qu'avec tout problème de latence. S'il s'agit de latence, elle devrait être tout aussi mauvaise au début que 10 minutes plus tard. Si un chronomètre de jeu tourne légèrement plus vite que l'autre, il y aura des artefacts de gigue étranges qui empireront de plus en plus avec le temps. Un client pourrait être en train de simuler à l'avenir, lorsque les paquets actuels arriveront du serveur, cela entraînera le client en arrière, provoquant des sauts d'entités. Exécutez quelques tests supplémentaires pour le découvrir.

Si les horloges de jeu non synchronisées sont effectivement un problème, vous devrez examiner très attentivement votre boucle de mise à jour et vous assurer que chaque mise à jour est basée sur le temps de jeu passé (fixe ou variable), et que le jeu -time est avancé en utilisant quelque chose comme l'horloge murale (pas le temps de rendu ou d'autres variables). Gaffer a de bons articles à ce sujet, et il y a une question décente ici à propos des pas de temps fixes vs variables . J'espère que cela t'aides.

John McDonald
la source
Ce n'est pas le cas, le cas est en effet le fait que je pense trop loin (un pic de retard ou quelque chose - le paquet à «arrêter» n'est pas reçu à temps et le client ne peut pas se corriger à temps. Je le sais définitivement) le cas parce qu'après que le client s'est arrêté, je peux très bien interpoler de nouveau en position.
Vaughan Hilts