Je travaille sur un jeu de tir 2D descendant et je fais de mon mieux pour copier les concepts utilisés dans les jeux en réseau comme Quake 3.
- J'ai un serveur faisant autorité.
- Le serveur envoie des instantanés aux clients.
- Les instantanés contiennent un horodatage et des positions d'entité.
- Les entités sont interpolées entre les positions des instantanés afin que le mouvement soit fluide.
- Par nécessité, l'interpolation d'entité se produit légèrement "dans le passé" de sorte que nous avons plusieurs instantanés dans lesquels interpoler entre.
Le problème auquel je suis confronté est la "synchronisation d'horloge".
- Par souci de simplicité, supposons un instant qu'il n'y a aucune latence lors du transfert de paquets vers et depuis le serveur.
- Si l'horloge du serveur a 60 secondes d'avance sur l'horloge du client, un horodatage d'instantané aura 60000 ms d'avance sur l'horodatage local du client.
- Par conséquent, les instantanés d'entité seront collectés et assis pendant environ 60 secondes avant que le client ne voit une entité donnée effectuer ses mouvements, car il faut autant de temps à l'horloge du client pour rattraper son retard.
J'ai réussi à surmonter cela en calculant la différence entre l'horloge du serveur et celle du client chaque fois qu'un instantané est reçu.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
Lors de la détermination de la distance dans l'interpolation de l'entité, j'ajoute simplement la différence à l'heure actuelle du client. Le problème avec cela, cependant, est qu'il provoquera des saccades, car la différence entre les deux horloges fluctuera brusquement en raison des instantanés arrivant plus rapidement / plus lentement que les autres.
Comment synchroniser les horloges suffisamment étroitement pour que le seul retard perceptible soit celui qui est codé en dur pour l'interpolation et celui qui est causé par la latence du réseau ordinaire?
En d'autres termes, comment empêcher l'interpolation de démarrer trop tard ou trop tôt lorsque les horloges sont considérablement désynchronisées, sans introduire de secousses?
Edit: Selon Wikipedia , NTP peut être utilisé pour synchroniser les horloges sur Internet en quelques millisecondes. Cependant, le protocole semble compliqué, et peut-être exagéré pour une utilisation dans les jeux?