Код игровой сети - предсказание и исправление на стороне клиента - PullRequest
4 голосов
/ 02 января 2012

Я создаю 2d sidescroller mmorpg, используя winsock и c ++, и я хотел спросить, как программировать предсказание и коррекцию на стороне клиента?Что ж, особенно исправление, потому что предсказание - это просто выполнение физического кода, который вы запускаете на сервере на клиенте.Сервер отправляет исправления примерно каждые две секунды.Это сообщение содержит позиции X & Y и скорость X & Y, а также ввод, такой как левый 0, правый 1, прыжок 1 ...

Редактировать: Это нормально, что я делаю то же самое для других клиентов?Поэтому вместо отправки снимков положения и скорости я отправляю только измененные данные, и локальный клиент будет прогнозировать, куда переходят другие клиенты.Сервер отправляет исправления каждые 2-3 секунды.

Большое спасибо!

1 Ответ

7 голосов
/ 09 января 2012

Обычно то, что делается в играх этого типа:

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

  2. Сообщаем серверу, где вы находитесьэто сложный вопрос.Если сервер полагается на то, что игроки отправляют свои собственные позиции и скорости, клиент может подделать свою позицию, чтобы обойти препятствия.В идеале сервер должен просто получать входные данные клиента и обрабатывать полученное движение напрямую, поэтому можно быть уверенным, что люди перемещаются законным образом.Однако задержка в получении входных данных на сервер делает это непрактичным, поэтому вам может потребоваться промежуточное решение, когда клиент говорит: «Я был здесь, в точке (x, y), когда я изменил свою скорость на (s, t)» (то есть клавиша прыжка была нажата в точке x, y), и сервер просматривает эту информацию и говорит: «Согласно моему прогнозируемому движению для этого клиента, он фактически был довольно близко к этой точке всего 0,7 секунды назад, поэтому я считаю, что он действительно сделализмените его скорость на (s, t) в этой точке. И мой прогноз на последние 0,7 секунды оказался неточным, поэтому игрок на самом деле имеет значение (x, y) + (s, t) * 0.7 ". Если сервер не согласен, этодолжен сообщить игроку, где, по его мнению, он или она находится в данный момент, чтобы игрок вернулся в положение, указанное сервером.Например, если на сервере произошел взрыв до того, как клиентский ввод попал на сервер, то представление клиента о себе в мире больше не является точным.Аналогично, если клиент пытается отправить ложную позицию далеко от своего текущего местоположения или нелепо высокую скорость движения.Сервер должен положить удар, так сказать:)

  3. Сервер отправляет каждому клиенту позицию и скорость каждого игрока в его или ее окрестностях ,Положение и скорость достаточны, чтобы полностью предсказать и экстраполировать движение игрока.Другими словами, другим игрокам все равно, какие клавиши нажимаются или что-то подобное, подтверждение точности уже было сделано сервером.Движения NPC и ИИ могут обрабатываться на стороне клиента, поэтому отправлять их не нужно.

  4. Сетевые игры почти всегда выполняются с использованием сокетов UDP.Сокеты UDP имеют намного меньшую нагрузку, чем TCP, поскольку пакеты не подтверждаются получателем.Если они потеряны, они ушли навсегда.Несмотря на то, что это сохраняет подтверждение приема, вы не можете предполагать, что пакет когда-либо попадал на сервер или наоборот.Это сложная вещь при отправке входных событий.Идеально всегда отправлять «снимки» текущего состояния, а не изменения в состоянии, потому что даже если пакеты теряются при передаче, вы узнаете правильное состояние, как только пакет поступит. Другими словами, вы всегда хотите сказать «это то, где я нахожусь, и то, что я сейчас делаю ", а не" я нажал Прыжок 3 раза ".

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

Извините, если этослишком долго ...

...