Как обрабатывать случайные движения в реальном времени с помощью предсказания на стороне клиента

10

Я создаю многопользовательскую игру в реальном времени, которая запускает один и тот же «физический» цикл на клиенте и сервере. Я использую рулевое поведение «странствие», которое является важным случайным движением. Клиент и сервер генерируют разные случайные числа при запуске алгоритмов блуждания.

Мне интересно, как я могу сохранять естественно случайное движение, но использую некоторую константу, которая гарантирует, что клиент и сервер придут к одному и тому же выводу.

kevzettler
источник
4
Генерация одной и той же случайной последовательности из последовательности псевдослучайных чисел проста. Трудно синхронизировать использование этой последовательности. Вы должны сделать свою игровую логику детерминированной, не в том смысле, что вы не используете случайную последовательность, но чтобы использовать случайную последовательность детерминированным способом. Самый простой способ достичь этого обычно состоит в том, чтобы избежать какого-либо параллелизма в игровом логическом цикле, однако возможен параллелизм, если потоки не зависят от синхронизации и последовательности PRNG при запросе PRNG о случайном значении. Здесь быть драконом.
Ли Райан

Ответы:

14

Вы можете использовать случайное семя . Выберите одно и то же 32-битное значение на сервере и клиенте (или сервер может отправить его клиенту при запуске). Используйте его как семя для генератора случайных чисел. Вы можете отправить фактическое начальное число с сервера на клиент с обновлением состояния игры. Если вы не хотите отправлять его, вы должны быть уверены, что клиент и сервер генерируют одинаковое количество случайных чисел с помощью этого генератора случайных чисел.

Что вы должны знать, прежде чем решили не отправлять фактическое семя клиенту:

  • У вас будут проблемы с отбраковкой персонажа на клиенте (значит, не обрабатывайте персонажей в тумане войны на клиенте). Если вы хотите сделать выборку персонажа лучшим решением будет отправка всех состояний персонажа (с фактическим начальным числом) с сервера клиенту, когда клиент должен обработать символ. Таким образом, сервер должен решить, когда клиент должен обрабатывать символы, а когда нет. Убедитесь, что вы используете отдельные генераторы случайных чисел для каждого персонажа.
  • Та же проблема будет с AI лодами.
  • Случайное число из этого генератора случайных чисел должно генерироваться только при обновлении с фиксированной дельтой времени. Если вы хотите использовать случайную цифру для интерполяции AI перед рендерингом, вам следует использовать отдельный генератор случайных чисел (на сервере нет рендера, поэтому не важно, какое начальное число вы будете использовать).
  • Если вы хотите использовать разные платформы для клиента и сервера (например, C ++ и Java), вы должны реализовать (или найти) кроссплатформенный генератор случайных чисел. Это не большая проблема, потому что генераторы случайных чисел легко реализовать.
Костя Регент
источник
3

Если и сервер, и клиент согласны с начальным числом, большинство алгоритмов рандомизации выдают одинаковые значения.

Линс Ассассино
источник