Pour créer un jeu comme un RTS en réseau, j'ai vu un certain nombre de réponses suggérer de rendre le jeu complètement déterministe; Ensuite, il vous suffit de transférer les actions des utilisateurs les uns aux autres et de décaler ce qui est affiché afin de "verrouiller" l'entrée de tout le monde avant le rendu de la prochaine image. Ensuite, des éléments tels que les positions de l'unité, la santé, etc., n'ont pas besoin d'être constamment mis à jour sur le réseau, car la simulation de chaque joueur sera exactement la même. J'ai également entendu la même chose suggérée pour faire des replays.
Cependant, puisque les calculs en virgule flottante ne sont pas déterministes entre les machines, ou même entre différentes compilations du même programme sur la même machine, est-ce vraiment possible? Comment pouvons-nous empêcher ce fait de causer de petites différences entre les joueurs (ou les replays) qui se répercutent tout au long du jeu ?
J'ai entendu dire que certaines personnes suggèrent d'éviter complètement les nombres à virgule flottante et d'utiliser int
pour représenter le quotient d'une fraction, mais cela ne me semble pas pratique - que faire si j'ai besoin, par exemple, de prendre le cosinus d'un angle? Dois-je sérieusement réécrire toute une bibliothèque de mathématiques?
Notez que je suis principalement intéressé par C # qui, autant que je sache, a exactement les mêmes problèmes que C ++ à cet égard.