Как структурировать простой игровой сервер для многопользовательской игры?

9

Я хотел бы создать простой многопользовательский игровой сервер для простой игры:

Предполагается, что игра похожа на Command & Conquer, у вас есть несколько танков и несколько солдат. Вы можете выбрать одного солдата, а затем нажать на карту, куда солдат должен идти. Если солдат приходит в район, куда он не может пойти, он ходит. И солдаты могут быть сбиты врагами.

Как мне структурировать игровой сервер и что делать на клиенте?

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

Что должно быть сделано на сервере, и я думаю, что я должен составить протокол для этого. Я думаю, что сервер должен отслеживать состояние игры и время. У кого-нибудь есть предложения, как это сделать? или могли бы порекомендовать почитать?

Jonas
источник

Ответы:

12

Вообще это очень сложный предмет. У вас две противоречивые цели (по крайней мере, если вы не планируете запускать каждую игру на выделенном сервере):

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

Я не могу точно сказать, как решить это для RTS. Что мы делаем для запуска FPS, так это чтобы сервер сохранял полное состояние мира некоторое время назад и давал клиенту метку времени для каждого выстрела. Когда в сети появляется сообщение «Я уволен!» достигает сервера, сервер может откатить мир и выполнить тесты столкновений и т. д. по всему миру «так, как он искал клиента, когда был произведен выстрел».

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

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

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

slicedlime
источник
1
На самом деле есть три (или, может быть, больше) противоречивые цели. В-третьих, производительность, сохранение и обновление состояния игры в реальном времени на сервере с использованием большого количества ресурсов.
Барт ван Хейкелом
2
О, и вы можете легко решить # 2, введя искусственное отставание, равное среднему отставанию других игроков. Что ж, если вы можете назвать «сделать все плохо», то это решение.
Барт ван Хейкелом
@Bart: отчасти верно, но, конечно, должна быть ограничена степень искусственного запаздывания, иначе более медленные соединения могут постоянно приводить к слишком быстрому запаздыванию более быстрых соединений, что, безусловно, является тем, что вам нужно.
о0 '.
Найти лучший путь не составит труда, если он выполняется на клиенте, если он найдет его и отправит решение на сервер, который - как и при любом перемещении - проверяет, является ли он правильным.
о0 '.
2

Есть в основном два подхода:

  1. Доверенный клиент
  2. Ненадежный клиент

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

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

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

Andreas
источник
Спасибо, это было информативно. Я думаю, что я пойду на ненадежных клиентов, и делать работу на сервере. У меня не будет много игроков в начале.
Джонас
1
«У меня не будет много игроков ...» Я не могу сосчитать, сколько разработчиков дали мне эту строчку и вернулись через шесть недель: «У меня есть 5000 игроков, которые хотят заплатить, чтобы играть в мою игру, но я не могу масштабировать :( ". Просто имейте это в виду!
Андреас
9
«Доверенный клиент» - это не подход, это ошибка.
о0 '.