Aby stworzyć grę podobną do sieci RTS, widziałem tutaj wiele odpowiedzi sugerujących, że gra jest całkowicie deterministyczna; musisz tylko przenieść do siebie działania użytkowników i opóźnić to, co się trochę wyświetla, aby „zablokować” dane wejściowe wszystkich osób przed renderowaniem następnej klatki. Wówczas rzeczy takie jak pozycja jednostki, zdrowie itp. Nie muszą być stale aktualizowane przez sieć, ponieważ symulacja każdego gracza będzie dokładnie taka sama. Słyszałem również to samo, co sugerowałem przy tworzeniu powtórek.
Jednak skoro obliczenia zmiennoprzecinkowe nie są deterministyczne między maszynami, a nawet między różnymi kompilacjami tego samego programu na tej samej maszynie, czy to naprawdę jest możliwe do zrobienia? Jak zapobiegamy temu, by fakt ten powodował niewielkie różnice między graczami (lub powtórkami), które falują w trakcie gry ?
Słyszałem, jak niektórzy ludzie sugerują całkowite unikanie liczb zmiennoprzecinkowych i użycie int
do przedstawienia ilorazu ułamka, ale nie wydaje mi się to praktyczne - co jeśli na przykład muszę wziąć cosinus kąta? Czy naprawdę muszę przepisać całą bibliotekę matematyczną?
Zauważ, że interesuje mnie głównie C #, który, o ile mogę powiedzieć, ma dokładnie takie same problemy jak C ++ w tym zakresie.