Хранение синхронизации в многопользовательской стратегии в реальном времени, которая использует арифметику с плавающей точкой

Я пишу 2D стратегию в реальном времени пространства в C#. Одиночные работы. Теперь я хочу добавить некоторую многопользовательскую функциональность. Я погуглил для него, и кажется, что существует только один способ иметь тысячи единиц, непрерывно перемещающихся без мощного сетевого соединения: отправьте только команды через сеть при выполнении того же моделирования в каждом плеере.

И теперь существует проблема, которую все использование механизма удваивает везде. И вычисления с плавающей точкой, зависит в большой степени от компилятора optimalizations и архитектуры ЦП, таким образом, очень трудно сохранить вещи синхронизируемыми. И это не сетка, базирующаяся вообще, и имейте простой механизм физики для перемещения космических кораблей (космические корабли имеют импульс и угловой момент...). Так перекодирование всего материала для использования фиксированной точки было бы довольно громоздким (но вероятно единственное решение).

Таким образом, у меня есть 2 опции до сих пор:

  • Скажите до свидания текущему коду и перезапустите с нуля целые числа использования
  • Сделайте игру LAN только там, где существует достаточно пропускной способности, чтобы иметь 8 плееров с тысячами единиц и отправки положений и ориентации и т.д. в (почти) каждом кадре...

Так я ищущий лучшие мнения, (или даже подсказки относительно миграции кода к фиксированной точке, не портя все...)

7
задан Calmarius 22 December 2009 в 20:29
поделиться

3 ответа

Конечно, все ваши клиенты будут использовать один и тот же бинарник, поэтому оптимизация компилятора не влияет на проблемы синхронизации.

Также, если вы планируете нацеливаться только на одну архитектуру (или, по крайней мере, разрешаете людям играть друг против друга, если они находятся на одной архитектуре), то это тоже не имеет значения.

Я сделал то же самое, используя плавающие точки в C# развивающих игр для iPhone и рабочего стола, и они оба дают те же результаты, даже если iPhone является ARM и рабочего стола является x86.

Просто убедитесь, что игра делает точно те же вычисления, и вы будете в порядке.

Если все остальное не удается, просто замените все экземпляры float в вашей игре на стандартный класс арифметики с фиксированной точкой. Таким образом, вы можете быть на 100% уверены, что ваши вычисления детерминированы по всем архитектурам, хотя природа арифметики с фиксированными точками может отрицательно сказаться на вашей игре

.
2
ответ дан 7 December 2019 в 16:42
поделиться

Общий метод заключается в том, чтобы все клиенты периодически описывали другим клиентам свое текущее состояние.

Когда два компьютера расходятся во мнениях о состоянии объекта, предположительно из-за ошибки с плавающей точкой, в игре есть некоторое правило, которое определяет, какое из них правильное, и все клиенты настраиваются на его соответствие.

0
ответ дан 7 December 2019 в 16:42
поделиться

Для чего именно вы используете удвоения? Можете ли вы использовать десятичную дробь вместо нее?

В общем, сервер будет хранить состояние (позицию/проявление/тип) всех юнитов игроков.

Когда игрок1 перемещает юнит либо... инстинкт перемещения посылается на сервер. или... обновленное состояние посылается на сервер

Когда клиенту игрока необходимо воспроизвести сцену, сервер посылает обратно информацию о состоянии всех юнитов в запрашиваемом диапазоне.

.
0
ответ дан 7 December 2019 в 16:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: