Подходят ли WebSockets для многопользовательских игр в реальном времени?
Я заинтересован в создании небольшой многопользовательской игры в реальном времени, используя HTML5 / JavaScript для клиента и, вероятно, Java для серверного программного обеспечения.
Я немного заглянул в WebSockets, но, похоже, у меня были неправильные представления о том, что такое WebSockets. Сначала я думал о WebSockets как о способе обработки TCP-сокетов JavaScript, так же, как они используются в Java и других языках, но, похоже, есть целый процесс рукопожатия, который должен иметь место, и каждый передача включает в себя много http-накладных расходов (и в этом случае преимущества над Ajax не кажутся такими захватывающими, как на первый взгляд)?
по смежной теме, есть ли лучшие альтернативы WebSockets для этой цели (многопользовательские игры в реальном времени в JavaScript)?
5 ответов
WebSockets-лучшее решение для многопользовательских игр в реальном времени, работающих в веб-браузере. Как указано в комментариях, существует начальное рукопожатие, при котором HTTP-соединение обновляется, но как только соединение установлено, WebSockets предлагает механизм соединения с наименьшей задержкой для двунаправленной связи между сервером и клиентом.
Я бы рекомендовал вам смотреть этот: https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.be
посмотреть:
- http://browserquest.mozilla.org/ код доступен здесь:https://github.com/mozilla/BrowserQuest
- https://chrome.com/supersyncsports/
единственным необработанным решением TCP было бы использовать плагин, который поддерживает какой-то объект TCPClient. Я бы рекомендовал вам попробовать WebSockets.
вы можете найти несколько вариантов здесь. Просто найдите WebSockets на странице.
посмотрите WebRTC. В зависимости от цели вашей игры и того, нужен ли вам сервер для управления состоянием игры, вы можете использовать эту технологию для одноранговой связи. Вам все еще может понадобиться решение для размещения игроков в группы - В этом случае WebSockets является самым быстрым/лучшим решением.
многопользовательские игры требуют, чтобы сервер отправлял периодические снимки состояния мира клиенту. В контексте приложения HTML/js браузера у вас есть небольшой выбор: опрос, websocket или написать свой собственный плагин для расширения возможностей браузера.
http-опрос, такой как Бош или Байе являются сложными, но вводит сетевые накладные расходы и задержку. Websocket был разработан, чтобы преодолеть их ограничение и, безусловно, больше отзывчивый.
библиотеки, такие как принятый в cometd или гнездо io, предоставить абстракцию транспорта и решить проблемы совместимости браузера для вас. Кроме того, он позволяет переключаться между базовыми транспортами и сравнивать их производительность без усилий.
Я предлагаю вам посмотреть nodejs и гнездо.io для того, чтобы иметь возможность обмениваться кодом между клиентом и сервером, вы также заимствуете многопользовательский код в [3].
Я не уверен, что WebSockets по-прежнему лучший инструмент для сетей мультиплеер в реальном времени в эти дни (2017). WebRTC новые технологии который предлагает потенциал гораздо более высокой производительности. И эти days, WebRTC также проще работать с помощью следующих библиотек:
- узел-webrtc упрощает серверную сеть
- webrtc-родной который также предоставляет библиотеку на стороне сервера и может быть быстрее, как предполагает его название
- electron-webrtc обеспечивает реализацию, которая является хорошим совпадением, если вы хотите упаковать свою игру с помощью электрон
кроме того, если вы хотите избежать фактических деталей сетевой реализации, и вы ищете библиотеку, которая предоставляет многопользовательский интерфейс более высокого уровня, взгляните на Лэнс.gg. (отказ от ответственности: я один из участников).
в принципе, у вас есть 3 варианта на момент написания этой статьи:
WebSockets
WebSockets-это легкий протокол обмена сообщениями, который использует TCP, а не Javascript-реализацию сокетов TCP, как вы заметили. Однако, помимо начального рукопожатия, нет никаких HTTP-заголовков, передаваемых туда и обратно за эту точку. Как только соединение установлено, данные проходят свободно, с минимальным накладные расходы.
долго-опроса
длинный опрос, в двух словах, включает в себя клиентский опрос сервера для получения новой информации периодически с HTTP-запросами. Это очень дорого с точки зрения процессора и пропускной способности, так как вы отправляете здоровенный новый HTTP-заголовок каждый раз. Это, по сути, ваш единственный вариант, когда дело доходит до старых браузеров и библиотек, таких какгнездо.Ио используйте длинный опрос в качестве запасного варианта в этих случаи.
WebRTC
в дополнение к тому, что уже упоминалось, WebRTC позволяет осуществлять связь через UDP. UDP уже давно используется в многопользовательских играх в не веб-средах из-за его низких накладных расходов (относительно TCP), низкой латентности и неблокирующего характера.
TCP "гарантирует", что каждый пакет поступит (за исключением катастрофического сбоя сети), и что они всегда будут поступать в том порядке, в котором они были отправлены. Это здорово для критической информации, такой как регистрация баллов, хитов, чат и так далее.
UDP, с другой стороны, не имеет таких гарантий. Пакеты могут поступать в любом порядке или не поступать вовсе. Это на самом деле полезно, когда дело доходит до менее важных данных, которые отправляются на высокой частоте, и должны прибыть как можно быстрее, например, позиции игрока или входы. Причина в том, что потоки TCP блокируются, если один пакет задерживается во время транспортировки, что приводит к большим пробелам в состоянии игры новинки. С UDP вы можете просто игнорировать пакеты, которые прибывают поздно (или вообще не прибывают), и продолжить с самым следующим, который вы получите, создавая более плавный опыт для игрока.
на момент написания этой статьи WebSockets, вероятно, ваш лучший выбор, хотя принятие WebRTC быстро расширяется и может быть предпочтительным к тому времени, когда вы закончите свою игру, так что это что-то рассмотреть.
Если вы планируете использовать JavaScript для своей игры (как и вы), то WebSocket-лучший выбор для вас. И если вы хотите поддерживать более старую версию Internet Explorer, подумайте о системе Signal R, разработанной Microsoft. Они используют WebSocket под капотом,но у них также есть несколько вариантов отступления...поэтому протокол будет использовать лучшее доступное решение.