Comment synchroniser le client et le serveur lors de l'envoi de modifications de vitesse du lecteur?

10

J'implémente la prédiction côté client. La plupart des explications supposent que le client envoie des messages comme " Déplacer mon lecteur d'une position vers le haut ". Que se passe-t-il si j'envoie des messages comme " Définir la vitesse de mon lecteur sur x "?

graphique explicatif;  affichage des messages envoyés et des positions calculées sur le client et le serveur au fil du temps

Sur le client, le joueur définit sa propre vitesse (par prédiction côté client) avant le serveur, ce qui entraîne la désynchronisation des deux. Ce problème persiste même en considérant la latence moyenne.

Comment puis-je résoudre ce problème?

Blu3
la source

Réponses:

8

Vous devez envoyer des données redondantes, ce qui signifie ici envoyer la position et la vitesse. Même si vous n'êtes pas synchronisé, le fait que vous ayez la position et la vitesse vous permet de corriger la trajectoire à l'aide d'une fonction d'interpolation.

Ensuite, l'utilisation de quelques astuces comme des animations retardées, des accélérations, etc. permet de masquer la latence.

Edit: je suppose que le serveur fait autorité.

Thelvyn
la source
Merci pour votre réponse. Oui, le serveur fait autorité mais même si j'envoie des données redondantes avec ma vitesse, le client pourrait corriger ses erreurs mais je lis souvent des choses comme "Si le client / serveur utilise du code partagé pour leurs entités, les erreurs de prédiction ne se produiront jamais vraiment" mais dans mon cas, ils se produiront TOUJOURS légèrement, ce qui provoquerait un bégaiement partout.
Blu3
1
@ user13842 le client sera toujours désynchronisé, vous devez corriger la position et la vitesse côté client, comme Thelvyn l'a dit, selon ce que le serveur vous envoie. De cette façon, vous n'obtiendrez pas le mouvement de bégaiement à moins que votre client ne soit complètement désynchronisé, vous devrez alors casser les valeurs car la correction prendrait beaucoup trop de temps.
dreta
C'est la principale raison d'utiliser une fonction d'interpolation. Vous ne pouvez pas éviter la latence, vous devez donc corriger le mouvement de manière fluide. Le client et le serveur simulent le monde mais le client doit écouter le serveur et effectuer des corrections. Quelques techniques utilisées dans la mise en réseau du moteur source: developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Thelvyn
il est également brièvement mentionné dans cette discussion sur Google, il devrait faire passer l'idée sur youtube.com/watch?v=Prkyd5n0P7k#t=18m47s
dreta
J'ai trouvé une autre solution à ce problème particulier. J'ajoute l'heure à laquelle le client a appliqué son entrée avec chaque paquet. Signification # 1 aurait le temps: 0 et la deuxième fois: 100. Maintenant, le serveur sait que le client a appuyé sur son bouton au moment: 100 et pas avant.
Blu3