Какие проблемы возникают при реализации многопользовательских игр в реальном времени? - PullRequest
15 голосов
/ 18 сентября 2008

У меня есть некоторый опыт создания многопользовательских пошаговых игр с использованием сокетов, но я никогда не пытался играть в экшн в реальном времени. С какими дополнительными проблемами мне придется иметь дело? Нужно ли вести историю действий игрока на случай, если отстающие игроки что-то сделают в прошлом? Мне действительно нужно использовать пакеты UDP или будет достаточно TCP? Что еще?

Я еще не решил, что делать, но для целей этого вопроса вы можете рассмотреть 2D-игру для 10 игроков с движением X Y.

Ответы [ 5 ]

20 голосов
/ 18 сентября 2008
  • 'клиент-сервер' или 'peer to peer' или что-то среднее между ними: какой компьютер имеет полномочия над какими действиями в игре.

В пошаговых играх, как правило, очень просто сказать: «У сервера есть все полномочия, и мы закончили». В играх реального времени часто этот дизайн - отличное место для старта, но как только вы добавляете задержку, клиент / движение / действие перестает отвечать. Таким образом, вы добавляете какое-то «скрытие задержек», позволяющее вводить данные клиентов, чтобы немедленно воздействовать на их персонажа или юнитов, чтобы решить эту проблему, и теперь вам приходится иметь дело с урегулированием проблем, когда игровое состояние клиента и сервера начинает расходиться. 9 раз из 10, что просто отлично, вы выталкиваете или перетягиваете объекты, на которые клиент оказал влияние, на официальную позицию, но это 1 из 10 раз, когда объект является аватаром игрока или чем-то еще, такое решение неприемлемо, поэтому вы начинаете предоставить клиенту полномочия по некоторым действиям. Теперь вам нужно согласовать несколько игровых состояний на сервере и открыть себя для возможного «мошенничества» через вредоносного клиента, если вы заботитесь о подобных вещах. Это в основном то, где каждый телепорт / обман / любой баг / чит появляется.

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

  • «синхронизированный» или «асинхронный»

Общая стратегия обеспечения того, чтобы все игроки работали в одном и том же игровом состоянии, заключается в том, чтобы просто согласовать список входов игроков (с помощью одной из моделей, описанных выше), а затем синхронно воспроизводить игровой процесс на всех машинах. Это означает, что логика симуляции должна точно совпадать, иначе игры будут не синхронизированы. Это на самом деле и проще, и тяжелее, чем кажется. Это проще, потому что игра - это просто код, и код в значительной степени выполняется точно так же, когда он дает одинаковые входные данные (даже генераторы случайных чисел). Это сложнее, потому что есть два случая, когда это не так: (1) когда вы случайно используете случайные вне игрового симулятора и (2) когда вы используете поплавки. Первое исправлено наличием строгих правил / утверждений в отношении того, какие ГСЧ используются в каких игровых системах. Последнее решается без использования поплавков. (У поплавков на самом деле есть 2 проблемы, одна из которых работает очень по-разному в зависимости от конфигурации оптимизации вашего проекта, но даже если это было решено, они работают непоследовательно на разных процессорных архитектурах, лол). Starcraft / Warcraft и любая игра, которая предлагает «повтор», скорее всего, используют эту модель. На самом деле, наличие системы воспроизведения - отличный способ проверить, синхронизируются ли ваши ГСЧ.

С помощью асинхронного решения органы управления игрой просто передают все это состояние всем другим клиентам с определенной частотой. Клиенты берут эти данные и помещают их в свое игровое состояние (и обычно делают некоторую упрощенную экстраполяцию, пока не получат следующее обновление). Вот где «udp» становится жизнеспособным вариантом, потому что вы рассылаете спам по всему игровому состоянию каждые ~ 1 с или около того, удаление некоторой части этих обновлений не имеет значения. Для игр с относительно небольшим игровым состоянием (Quake, World of Warcraft) это часто самое простое решение.

6 голосов
/ 18 сентября 2008

Планирование - ваш лучший друг. Выясните, что на самом деле нужно.

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

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

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

Снова планирование - ваш лучший друг. План, план, план. Если вы думаете о проблеме достаточно, вы можете решить большинство проблем. Тогда вы можете начать думать о тех, которые вы еще не решили.

6 голосов
/ 18 сентября 2008

Есть несколько факторов, участвующих в настройке мультиплеера

  1. Протокол, важно, чтобы вы решили, хотите ли вы TCP или UDP. UDP имеет меньше накладных расходов, но не гарантирует доставку. Наоборот, TCP является более надежным. У каждой игры будет свой предпочтительный протокол. UDP, например, будет работать для шутера от первого лица, но может не подходить для RTS, где информация должна быть согласованной

  2. Firewall / Подключение. Убедитесь, что ваша многопользовательская игра не должна иметь 2000 исходящих подключений и использует стандартный порт, так что переадресация портов проста. Сопряжение с брандмауэром Windows, вероятно, будет дополнительным бонусом.

  3. Bandwidth. Это важно, сколько данных вы собираетесь протолкнуть через сетевое соединение? Я предполагаю, что это снизится, чтобы играть тестирование и записывать пропускную способность. Если вам требуется более 200 Кбит / с для каждого клиента, вы можете переосмыслить несколько вещей.

  4. Загрузка сервера. Это также важно, сколько обработки требуется серверу для нормальной игры? Вам нужен супер 8-ядерный сервер с 16 ГБ оперативной памяти для его запуска? Есть ли способы уменьшить его?

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

4 голосов
/ 18 сентября 2008

Насколько важно избегать мошенничества? [Можете ли вы доверять любой информации, поступающей от клиента, или им можно доверять и аутентифицировать?]

Модель объекта Как объекты передаются с одной машины на другую? Как выполняются действия над объектом?

Вы делаете клиент / сервер или пиринг?

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

Если вы делаете клиент / сервер, как вы справляетесь с лагом? [мертвый расчет?]

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

Посетите RakNet, где можно бесплатно загрузить код и обсудить группы.

0 голосов
/ 18 сентября 2008

TCP хорошо, если вы работаете в локальной сети. Но если вы хотите играть онлайн, вы должны использовать UDP и реализовать свой собственный TCP-подобный уровень: необходимо пройти через маршрутизаторы throw NAT.

Вам необходимо выбрать одноранговую или клиент-серверную связь. В модели клиент-сервер синхронизация и состояние мира проще реализовать, но у вас может быть недостаток реактивности в сети. В Pee-to-peer это сложнее, но быстрее для игрока.

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

...