Timestep в многопользовательской игре

8

Я пытаюсь обдумать концепцию создания многопользовательского взаимодействия сервер / клиент.

Моя проблема в основном связана с временным шагом. Рассмотрим следующий сценарий:

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

Поскольку клиент и сервер работают на разных временных шагах, как вы точно моделируете, чтобы все клиенты были синхронизированы с сервером? Мой сервер в настоящее время установлен на 30 мсек. Когда я обрабатываю перемещения клиента, потенциально могут быть обработаны сотни запросов, но невозможно указать, сколько времени прошло между каждым из запросов.

Я действительно не понимаю, как правильно моделировать сервер на основе времени, чтобы все синхронизировалось.

jgallant
источник
3
Вы также можете попробовать эти ссылки: Быстрая многопользовательская игра в
сетевую игру

Ответы:

3

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

На обоих концах вам нужен процесс для «заполнения» любых кадров, в которые пакеты не принимаются.

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

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

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

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

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

Эндрю Рассел
источник
Если сервер получает 10 входных команд от клиента между одним шагом сервера. Сервер выполняет 10 команд ввода. Как мы узнаем, как долго имитируется каждая входная команда? Что, если вы получаете только одну входную команду, вы имитируете команду в течение всего временного интервала временного шага?
jgallant
1
@Jon Большинство «экшн» игр посылают входные данные в виде кнопок вверх / вниз в каждом кадре. Затем сервер просто использует последнее полученное состояние в качестве состояния для этого обновления. Отброшенные, поздние и вышедшие из строя пакеты игнорируются. (По крайней мере, на базовом уровне - вы можете, например, добавить дополнительную информацию о последовательности, чтобы очень короткое состояние «вверх» или «вниз» не игнорировалось, даже если оно было отброшено.) Это, вероятно, то, что вы должны делать для всех входов, связанных с синхронизацией. , Действия, основанные на командах (например, «переместиться сюда» в RTS), как правило, не имеют связанной продолжительности, поэтому вы просто выполняете их по порядку.
Эндрю Рассел