Подходят ли WebSockets для многопользовательских игр в реальном времени? - PullRequest
36 голосов
/ 17 ноября 2011

Я заинтересован в создании небольшой многопользовательской игры в реальном времени с использованием HTML5 / JavaScript для клиента и, возможно, Java для серверного программного обеспечения.

Я немного изучил WebSockets, но, похоже, у меня былозаблуждения о том, что на самом деле WebSockets.Сначала я считал WebSockets просто способом JavaScript для обработки TCP-сокетов, так же, как они используются в Java и других языках, но, похоже, существует целый процесс рукопожатия, который должен иметь место, и каждая передача включает в себя много HTTP-издержек (и вв этом случае преимущества по сравнению с Ajax кажутся не такими впечатляющими, как на первый взгляд)?

По связанной теме, есть ли лучшие альтернативы WebSockets для этой цели (многопользовательские игры в реальном времени на JavaScript)?

Ответы [ 5 ]

34 голосов
/ 17 ноября 2011

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

Я бы порекомендовал вам посмотреть это: https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.be

Посмотрите на:

Единственным необработанным решением TCP было бы использование плагина, который поддерживает некоторый объект TCPClient. Я бы порекомендовал вам попробовать WebSockets.

Вы можете найти несколько вариантов здесь . Просто найдите WebSockets на странице.

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

9 голосов
/ 07 апреля 2017

Я не уверен, что WebSockets все еще являются лучшим инструментом для организации многопользовательской игры в реальном времени (2017). WebRTC - это новейшая технология, которая предлагает потенциал гораздо более высокой производительности.И в наши дни с WebRTC также проще работать благодаря следующим библиотекам:

  • node-webrtc упрощает сетевое взаимодействие на стороне сервера
  • webrtc-native , который также предоставляет библиотеку на стороне сервера и может быть более быстрым, как следует из его названия
  • Electron-Webrtc обеспечивает реализацию, которая хорошо подходит, если вы хотите упаковать пакетваша игра использует электрон

В качестве альтернативы, если вы хотите позаботиться о реальных деталях сетевой реализации, и вы ищете библиотеку, которая предоставляет многопользовательский интерфейс более высокого уровнявзгляните на Lance.gg .(отказ от ответственности: я один из авторов).

7 голосов
/ 11 ноября 2012

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

HTTP-опрос, такой как BOSH или Bayeux сложен, но вводит сетевые издержки и задержку.Веб-сокет был разработан для преодоления их ограничений и определенно более отзывчив.

Библиотеки, такие как cometd или socket io , обеспечивают абстракцию транспорта и решают задачипроблемы совместимости браузера для вас.Кроме того, он позволяет переключаться между основными транспортными средствами и сравнивать их производительность без усилий.

Я кодировал многопользовательскую аркадную игру с socket.io и обычным измерением задержки 2 мс с веб-сокетом и около 30 мс с xhr-опросом по локальной сети.Этого достаточно для многопользовательских игр.

Я предлагаю вам взглянуть на nodejs и socket.io, чтобы иметь возможность обмениваться кодом между клиентом и сервером, вы также автомобильзаимствовать многопользовательский код в [ 3 ].

4 голосов
/ 13 декабря 2017

На момент написания этой статьи у вас есть 3 варианта:

WebSockets

WebSockets - это упрощенный протокол обмена сообщениями, использующий TCP, а не реализацию JavascriptTCP сокетов, как вы уже заметили.Однако, помимо первоначального рукопожатия, нет никаких HTTP-заголовков, передаваемых туда и обратно после этой точки.Как только соединение установлено, данные проходят свободно, с минимальными издержками.

Длинный опрос

Длинный опрос, в двух словах, подразумевает, что клиент опрашивает сервер дляновая информация периодически с HTTP-запросами.Это очень дорого с точки зрения процессора и пропускной способности, так как вы каждый раз отправляете огромный новый HTTP-заголовок.По сути, это единственный вариант, когда речь идет о старых браузерах, и в таких библиотеках, как Socket.io , в качестве запасного варианта используется длинный опрос.

WebRTC

В дополнение к тому, что уже упоминалось, WebRTC обеспечивает связь через UDP.Протокол UDP давно используется в многопользовательских играх, не связанных с сетью, из-за его низких издержек (по сравнению с TCP), низкой задержки и неблокирующей природы.

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

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

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

0 голосов
/ 08 июня 2015

Если вы планируете использовать JavaScript для своей игры (как и вы), то WebSocket - лучший выбор для вас. И если вы хотите поддерживать более старую версию Internet Explorer, подумайте о системе Signal R, разработанной Microsoft. Они используют WebSocket под капотом, но у них также есть несколько альтернативных вариантов ... поэтому протокол будет использовать лучшее доступное решение.

http://signalr.net/

...