Si vous ne l'avez pas déjà fait, je vous suggère de lire ces deux articles approfondis mais compréhensibles: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking et http://fabiensanglard.net/quake3/network.php .
Ceux-ci expliquent pourquoi il est conseillé d'utiliser l'envoi de paquets à «intervalle fixe». Pour être bref, c'est en fait surtout important pour les paquets envoyés par le serveur.
L'envoi d'un paquet a un coût fixe et la taille maximale d'un paquet réseau est d'environ 1,5 Ko. Donc, si vous avez par exemple 16 joueurs sur votre serveur, chaque image lorsque vous calculez le mouvement pour un joueur, un code naïf pourrait envoyer un paquet de mise à jour à chaque joueur après chaque résolution de mouvement, donc 16 * 16 = 256 paquets. Si vous avez une fréquence d'images de 30, cela représente 7680 paquets.
Une meilleure approche consiste à créer un tampon à chaque début de trame, à y concaténer la mise à jour de vos 16 positions calculées, puis à les envoyer à vos 16 joueurs.
Vous n'envoyez maintenant que 480 paquets par seconde pour les mêmes résultats.
Dans le cas du joueur au serveur, cela signifie simplement que vous devez envoyer, dans le même paquet, un maximum de données, comme; regardé la position, les actions appelées ce cadre et ainsi de suite.
À propos de la deuxième partie de votre question - la façon dont j'ai choisi de réduire la sensation de décalage était d'envoyer ces informations au serveur sur chaque trame:
position actuelle réelle du joueur (utilisée par le serveur pour vérifier si les positions côté serveur et côté joueur ne sont pas trop désynchronisées).
Position estimée du joueur en 1 seconde: calculée par le client: si le joueur ne change pas la direction de la souris et laisse le clavier dans son état actuel pendant 1 seconde, où sera le joueur? (nous ne nous soucions pas des collisions) Si le joueur ne bouge pas, sa position estimée en 1 seconde est sa position actuelle.
La position qu'il regarde.
Chaque fois que le serveur reçoit ces informations, il met à jour la position future et la position regardée, et l'entité joueur se déplace finalement vers sa position future.
Les joueurs ne sont jamais exactement synchronisés, mais la réponse d'entrée est instantanée (le plus important pour moi) et j'ai trouvé que les positions prédites étaient suffisamment précises pour moi.