WebSockets适用于实时多人游戏吗?

时间:2011-11-17 01:35:25

标签: javascript websocket multiplayer

我有兴趣构建一个小型的实时多人游戏,使用HTML5 / JavaScript作为客户端,也可能使用Java作为服务器软件。

我稍微研究了一下WebSockets,但看起来我对WebSockets实际上有什么误解。我最初认为WebSockets只是JavaScript处理TCP套接字的方式,就像在Java和其他语言中使用它一样,但似乎必须进行整个握手过程,并且每次传输都包含很多HTTP开销(并且那个案例,对Ajax的好处似乎并不像第一眼那样令人兴奋)?

在相关主题上,为此目的,有没有更好的WebSockets替代品(JavaScript中的实时多人游戏)?

5 个答案:

答案 0 :(得分:33)

WebSockets是在Web浏览器中运行的实时多人游戏的最佳解决方案。正如评论中所指出的,有一个初始握手,其中HTTP连接已升级,但一旦建立连接,WebSockets就为服务器和客户端之间的双向通信提供了最低延迟的连接机制。

我建议你看一下:https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.be

看看:

唯一的原始TCP解决方案是使用支持某种TCPClient对象的插件。我建议你试试WebSockets。

您可以找到许多选项here。只需在页面中搜索WebSockets。

另请查看WebRTC。根据游戏的目的以及是否需要服务器来管理游戏状态,您可以使用此技术进行点对点通信。您可能仍然需要一个解决方案来处理将玩家分组 - 在这种情况下,WebSockets是最快/最好的解决方案。

答案 1 :(得分:9)

我不确定WebSockets是否仍然是网络的最佳工具 这几天是一个实时多人游戏(2017年)。 WebRTC是一项新技术 它提供了更高性能的潜力。还有这些 由于以下库,WebRTC也更容易使用:

或者,如果您想要避免网络实施的实际细节,并且您正在寻找提供更高级别多人界面的库,请查看Lance.gg。 (免责声明:我是贡献者之一)。

答案 2 :(得分:7)

多人游戏要求服务器向客户端发送世界状态的定期快照。在浏览器HTML / js应用程序的上下文中,你几乎没有选择:轮询,websocket或编写自己的插件来扩展浏览器功能。

诸如BOSHBayeux之类的HTTP轮询很复杂,但会引入网络开销和延迟。 websocket旨在克服其限制,并且肯定更具响应性。

诸如cometdsocket io之类的库提供了传输的抽象,并为您解决了浏览器兼容性问题。最重要的是,它允许在底层传输之间切换并毫不费力地比较它们的性能。

我使用socket.io编码multiplayer arcade game,使用websocket通常测量2ms延迟,使用xhr-polling在lan上测量约30ms。这对于多人游戏来说已经足够了。

我建议您查看nodejs和socket.io,以便能够在客户端和服务器之间共享代码,您还可以在[3]上借用一些多人游戏代码

答案 3 :(得分:4)

基本上,在撰写本文时,您有3个选项:

<强>的WebSockets

WebSockets是一种轻量级的消息传递协议,它使用TCP,而不是TCP套接字的Javascript实现,正如您所指出的那样。但是,除了初始握手之外,没有HTTP标头在该点之外来回传递。建立连接后,数据可以自由传递,开销最小。

<强>长轮询

简而言之,长轮询涉及客户端使用HTTP请求定期轮询服务器以获取新信息。这在CPU和带宽方面非常昂贵,因为您每次都要发送大量新的HTTP标头。对于旧浏览器而言,这基本上是您唯一的选择,Socket.io等库在这些情况下使用长轮询作为后备。

<强>的WebRTC

除了已经提到的内容之外,WebRTC还允许通过UDP进行通信。 UDP长期以来一直用于非基于Web的环境中的多人游戏,因为它的开销较低(相对于TCP),低延迟和无阻塞特性。

TCP&#34;保证&#34;每个数据包将到达(除了灾难性的网络故障),并且它们将始终按照发送的顺序到达。这非常适合注册分数,点击,聊天等关键信息。

另一方面,UDP没有这样的保证。数据包可以按任何顺序到达,或者根本不到达。当涉及以较高频率发送的较不重要的数据并且需要尽快到达时(例如玩家位置或输入),这实际上是有用的。原因是如果在传输过程中单个数据包被延迟,TCP流将被阻止,从而导致游戏状态更新中存在较大差距。使用UDP,您可以简单地忽略迟到(或根本不会)的数据包,并继续使用您收到的下一个数据包,为播放器创造更流畅的体验。

在撰写本文时,WebSockets可能是您最好的选择,尽管WebRTC的应用正在快速扩展,并且在您完成游戏时可能会更好,所以这是一个很好的选择。考虑

答案 4 :(得分:0)

如果您计划在游戏中使用JavaScript(就像您一样),那么WebSocket是您的最佳选择。如果你想支持旧版本的Internet Explorer,那就想想微软开发的Signal R系统。他们正在使用WebSocket,但他们也有一些后备选项...所以协议将使用现有的最佳解决方案。

http://signalr.net/