Я делаю клиент-серверную игру в стиле MMO.Пока у меня есть структура, настроенная так, чтобы сервер и клиенты взаимодействовали друг с другом, чтобы обеспечить обновления состояния.Сервер поддерживает игровое состояние и периодически вычисляет следующее состояние, а затем время от времени (каждые n миллисекунд) отправляет новое состояние всем клиентам.Это новое состояние может быть просмотрено и отреагировано пользователем на стороне клиента.Эти действия затем отправляются обратно на сервер для обработки и отправки для следующего обновления.
Очевидная проблема заключается в том, что эти обновления требуют времени для перемещения между сервером и клиентами.Если клиент действует, чтобы атаковать врага, к тому времени, когда обновление вернулось на сервер, вполне возможно, что сервер продвинул игровое состояние настолько далеко, что противник больше не находится в том же месте и вне диапазона.
Чтобы бороться с этой проблемой, я пытался найти хорошее решение.Я посмотрел на следующее, и это помогло некоторым, но не полностью: Mutli Player Синхронизация игры .Я уже пришел к выводу, что вместо того, чтобы просто передавать текущее состояние игры, я могу передавать другую информацию, такую как направление (или целевое положение для движения ИИ) и скорость.Исходя из этого, у меня есть часть того, что необходимо для того, чтобы «угадать» на стороне клиента, каково реальное состояние (как его видит сервер), развивая игровое состояние на n миллисекунд в будущее.
проблема заключается в определении времени, необходимого для изменения состояния, поскольку оно будет зависеть от времени задержки между сервером и клиентом, которое может значительно различаться.Кроме того, должен ли я перевести состояние игры в состояние, в котором оно находится в данный момент, когда клиент просматривает его (т. Е. Учитывать только время, которое потребовалось обновлению, чтобы добраться до клиента), или мне следует продвинуть его достаточно далеко, чтобы при отправке его ответаобратно на сервер, к тому времени это будет правильное состояние (учетная запись как для поездки, так и для поездки).
Любые предложения?
Повторить:
1) Чтосамый лучший способ вычислить количество времени между отправкой и получением?
2) Должен ли я прогрессировать состояние на стороне клиента достаточно далеко, чтобы рассчитывать на весь круговой обход, или просто время, которое требуется для получения данныхот сервера к клиенту?
РЕДАКТИРОВАТЬ: Что я до сих пор придумал
Поскольку у меня уже есть много пакетов, идущих туда-сюда между клиентами и серверомЯ не хочу добавлять в этот трафик, если мне нужно.В настоящее время клиенты отправляют пакеты обновления состояния (UDP) на сервер ~ 150 миллисекунд (только если что-то изменилось), а затем они принимаются и обрабатываются сервером.В настоящее время сервер не отправляет ответ на эти пакеты.
Для начала я сделаю так, чтобы клиенты попытались оценить время их задержки.Я установлю значение по умолчанию на 50-100 миллисекунд.Я предлагаю, чтобы примерно каждые 2 секунды (для каждого клиента) сервер немедленно отвечал на один из этих пакетов, отправляя обратно индекс пакета в специальном пакете обновления синхронизации.Если клиент получает пакет синхронизации, он будет использовать индекс для расчета того, как давно этот пакет был отправлен, а затем использовать время между пакетами в качестве нового времени задержки.
Это должно держать клиентов разумнодата в их лаге, без слишком большого избыточного сетевого трафика.
Звук приемлемый, или есть лучший способ?Это по-прежнему не отвечает на второй вопрос.