J'implémente un serveur de jeu qui prend en charge la mêlée de type Star Control . Vous avez donc des navires qui volent et tirent, avec une physique super simple de vitesse / accélération / amortissement pour conduire le mouvement.
J'ai lu Valve, Gafferon et Gambetta et mis en œuvre l'algorithme de Gambetta pour la prédiction client:
La prédiction client fonctionne sur le vaisseau joueur en mettant à jour sa position depuis le serveur au fur et à mesure, puis en réappliquant l'entrée non encore traitée par le serveur au vaisseau joueur.
Malheureusement, cela ne fonctionne pas bien pour mon jeu. Je crois que cela a à voir avec le fait que l'exemple de Gambetta ne prend pas en compte les objets qui sont déjà en mouvement, ou les commandes qui sont mises à jour pas à pas. (par "étape", je veux dire le cadre). Donc, dans mon jeu, le joueur appuie pour accélérer le vaisseau (déjà en mouvement), qui continue de se déplacer sur le client, envoie la commande au serveur et reçoit généralement l'instantané du monde du serveur à l'étape suivante. Je reçois quelque chose de plus comme:
La commande player s'exécute à l' étape 3 du client , mais sur le serveur, elle ne s'exécute qu'à l' étape 5 du serveur . Au moment où l'instantané du monde est reçu par le client à l' étape 6 du client , la prédiction est loin, en particulier à des vitesses plus rapides.
Le nœud du problème est que le client exécute la commande à l' étape 5 , mais le serveur l'exécute à l' étape 6 . J'ai pensé à envoyer peut-être l'étape client avec la commande, et faire revenir le serveur et réexécuter la commande avec le pas de temps client. Cela pourrait conduire à une foule d'autres problèmes - comme ce qui arrive aux commandes reçues depuis la restauration, ou comment les clients tricheurs peuvent exploiter en changeant l'étape envoyée.
Lire et regarder des vidéos comme celle-ci de Google mentionne une approche différente, où vous modifiez progressivement la position du joueur pour correspondre à celle de l'instantané en quelques étapes.
Mes questions:
Pouvez-vous faire fonctionner l'algorithme de Gambetta avec un mouvement de pas constant? Ou est-il conceptuellement incompatible avec mon jeu?
L'interpolation progressive sur les étapes est-elle alors la bonne voie à suivre? Si c'est le cas, comment interpoler un objet déjà en mouvement depuis la position du client pour correspondre à celui qui vient d'être reçu du serveur?
Ces méthodes, l'interpolation progressive et l'algorithme de Gambetta peuvent-ils fonctionner en tandem, ou sont-ils mutuellement exclusifs?