Как написать сетевую игру? [закрыто]

На основе Почему так сложно разработать MMO ? :

  

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

Я знаю теорию о сокетах, серверах, клиентах, протоколах, соединениях и т. д.

Теперь мне интересно, как можно научиться писать сетевую игру:

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

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

Я ищу широкие ответы, но конкретные тоже хороши, чтобы узнать разницу.

69 голосов | спросил Tom Wijsman 15 J000000Thursday10 2010, 01:23:24

6 ответов


58

В дополнение к статье, связанной с другими ответами, я могу немного рассказать об опыте Arianne Project .

Как синхронизировать вещи?

У нас есть структура структуры Marauroa - вокруг концепции действий и восприятий: Действия отправляются от клиента к серверу, несущему пользовательский ввод, например (ходить влево, атаковать монстров # 47, сказать «привет»). И восприятие отправляется с сервера клиентам, рассказывающим им о состоянии мира, близком к ним. Эти восприятия отправляются каждый ход. В зависимости от игры мы используем время поворота от 30 мс до 300 мс.

У нас есть два типа восприятие : полное восприятие отправляется при входе в систему и когда игрок входит в новую зону (зону). После этого дифференциальное восприятие отправляется, включая только измененные атрибуты (например, положение) измененных объектов и, конечно, новые и удаленные объекты.

Как работать с проблемами латентности?

Мы твердо верим в то, что сервер всегда прав. Клиент делает некоторые прогнозы, такие как плавная ходьба, проверка коллизий и т. Д. Но если клиент и сервер не согласны в чем-то, сервер выигрывает. Подпроект Stendhal (2D RPG) использует время по умолчанию 300 мс по умолчанию (с большим количеством сглаживания на стороне клиента) , Это делает Стендаль очень устойчивым к запаздыванию.

Примечание. Некоторые другие игры доверяют клиенту в некоторой степени, чтобы минимизировать влияние задержки сети. В WoW его часто эксплуатировали в одном из полевых битв под названием «Warsong Gulch». Есть два способа, которыми игрок с флагом может выбрать: В середине через туннель и один на правом прицеле, поднимающемся на холм. Таким образом, мошенник бежит к туннелю, а затем задерживает себя. Сервер и другие клиенты будут продолжать видеть, как он бежит к нему. Но через некоторое время этот клиент может сказать серверу, что он пошел к холму. WoW проверит, что расстояние между последними переданными координатами и текущими находится в пределах временного сегмента и принимает это.

Использование UDP и TCP

В ранних версиях мы использовали UDP, чтобы уменьшить накладные расходы TCP. Мы сами обрабатывали потерянные пакеты. Это отлично работало в первые дни проекта. Но когда сервер несколько лет назад был перенесен из какого-то домашнего DSL-соединения в настоящий дата-центр, у нас возникли огромные проблемы. UDP (или, по крайней мере, было 5 лет назад) чрезвычайно требователен к мощности процессора оборудования брандмауэра: набор правил должен применяться к каждому пакету UDP. Однако для TCP набор правил применяется только для первых 3 пакетов. После этого устанавливается соединение. Все последующие пакеты обходят обычный набор правил, потому что они находятся в таблице отслеживания подключения или потому, что у них нет флага SYN. ​​

Как защитить связь и клиент от обратной инженерии?

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

Легко защитить сообщение от несанкционированного обнюхивания третьими лицами с использованием SSL.

Однако невозможно защитить его от обратного проектирования. Конечно, вы можете запутать его и использовать методы отладки. Но в итоге вы не можете предотвратить обратную разработку программного обеспечения, которое вы предоставляете пользователям. Существует очень интересная презентация о том, как изменился дизайн Skype, несмотря на то, что разработчики приложили много усилий к методам анти-отладки: http://recon.cx/en/f/vskype-part1.pdf

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

Какие вещи следует вычислять локально и какие вещи на сервере?

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

Предсказанные события - это, например, остановка движения при ударе столкновения. Стендаль использует сетку для размещения элементов. И изсерверная точка зрения, верхний левый угол каждой сущности находится на одном квадрате. Но клиент будет плавно перемещать их между плитами. Он также будет рисовать псевдо 3d-эффект. Таким образом, объект, имеющий базу 1x1, может быть выше в клиенте.

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

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

Балансировка нагрузки статического содержимого хорошо известна в области кластеров http-серверов и сетей распространения контента.

Довольно простая концепция балансировки нагрузки игровых сервисов заключается в разделении серверов по регионам /зонам. Таким образом, зона A-C находится на одном сервере, а зоны D-F находятся на другом. Это особенно удобно, если вы не можете смотреть из зон в одном наборе в зоны другого набора. Вам нужно поместить некоторые проверки там, чтобы клиент мог подключаться только к серверу зоны, отвечающему за зону, в которой находится игрок.

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

Некоторые дополнительные глобальные службы необходимы через: при входе в систему клиентам необходимо будет подключиться к правильному серверу зоны. И вам может понадобиться всемирная чат-система.

Я подробно рассмотрел эту тему на Как достигается балансировка нагрузки в MMO?

ответил Seyed Morteza Kamali 26 Jpm1000000pmFri, 26 Jan 2018 12:28:14 +030018 2018, 12:28:14
25

http://gafferongames.com/networking-for-game-programmers/

Отличный набор статей по различным проблемам и решениям, связанным с сетевой игрой.

ответил Seyed Morteza Kamali 26 Jpm1000000pmFri, 26 Jan 2018 12:28:14 +030018 2018, 12:28:14
8

В зависимости от типа игры, которую вы пишете, вы можете избежать некоторых низкоуровневых сетевых программ. Некоторые типы игр не требуют много обратной и обратной связи между клиентами и сервером. В таких случаях можно было бы использовать структуру более высокого уровня. Например, я разрабатываю пошаговую стратегическую игру в C # /. NET. Пошаговые стратегические игры несколько уникальны тем, что подавляющее большинство сообщений клиент /сервер происходит в начале и в конце хода, причем относительно мало между ними. Таким образом, я решил использовать Windows Communication Foundation (WCF), высокоуровневую инфраструктуру связи, предназначенную в первую очередь для веб-сервисов. Вместо того, чтобы работать непосредственно с сокетами и всем этим низкоуровневым сетевым gunk, я могу сделать то, что кажется стандартным вызовом метода, и позволить WCF иметь дело с протоколом и транспортными уровнями для меня. Единственный раз, когда мне приходилось иметь дело с низкоуровневыми сетевыми материалами, было то, что я сконфигурировал свои конечные точки, что в значительной степени одноразовая сделка в файле конфигурации. Может возникнуть необходимость в реализации некоторой логики логики сериализации, но вам нужно делать что-то независимо.

ответил Mike Strobel 15 J000000Thursday10 2010, 02:02:47
8

Вопрос слишком широк. Ответы могут заполнить сайт самостоятельно. Но есть книги, которые касаются этого, в первую очередь эти два:

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

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

ответил Mike Strobel 15 J000000Thursday10 2010, 02:02:47
7
  

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

фиксированный географический размер + несколько экземпляров - это самое простое решение. Ребята, работающие на SWG, пробовали динамический размер и сожалели об этом.

  

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

Сервер является авторитетным.

  

Как синхронизировать вещи?

Периодическая синхронизация обновлений с сервера. (не совсем уверен, что здесь вызывает беспокойство)

  

Как защитить связь и клиент от обратной инженерии?

невыполнима. просто убедитесь, что вы не доверяете чему-либо, что получаете от клиента, и что сервер является авторитетным.

  

Как работать с проблемами латентности?

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

  

Какие вещи следует вычислять локально и какие вещи на сервере?

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

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

ответил Mike Strobel 15 J000000Thursday10 2010, 02:02:47
4

Этот вопрос very широкий. Это также очень сложная область для освоения, сетевые программисты пользуются большим спросом в отрасли с соответствующей оплатой, которая, как бы то ни было, указывает, что это «нерешенная» область. Есть ли там книги, да, много. Есть хорошие книги, без сомнения. Есть ли там книги, которые ответят на ваши вопросы? ... Я так не думаю. У них могут быть решения, которые работают в некоторых ситуациях или указатели на то, что нужно искать, но почти все ваши вопросы зависят от игры ... это область, где вам действительно придется много работать самостоятельно, это так, казалось бы, тривиально, и это может пойти не так во многих (неконтролируемых) путях.

ответил Mike Strobel 15 J000000Thursday10 2010, 02:02:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132