Чтобы сделать игру похожей на сетевую RTS, я видел несколько ответов, предлагающих сделать игру полностью детерминированной; тогда вам нужно всего лишь передать действия пользователей друг другу и немного отстать от того, что отображается, чтобы «заблокировать» ввод всех пользователей до того, как будет визуализирован следующий кадр. Тогда такие вещи, как положение юнита, здоровье и т. Д. Не нужно постоянно обновлять по сети, потому что симуляция каждого игрока будет абсолютно одинаковой. Я также слышал то же самое, что предлагалось для повторов.
Однако, поскольку вычисления с плавающей точкой являются недетерминированными между машинами или даже между различными компиляциями одной и той же программы на одной машине, возможно ли это сделать? Как мы можем предотвратить возникновение небольших различий между игроками (или повторами), которые будут колебаться на протяжении всей игры ?
Я слышал, что некоторые люди предлагают вообще избегать чисел с плавающей запятой и использовать int
для представления частное дроби, но это не кажется мне практичным - что, если мне нужно, например, взять косинус угла? Мне серьезно нужно переписать целую математическую библиотеку?
Обратите внимание, что я в основном заинтересован в C #, который, насколько я могу судить, имеет точно такие же проблемы, что и C ++ в этом отношении.