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

Jos*_*ion 41 javascript multiplayer websocket

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

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

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

leg*_*ter 37

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

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

看一下:

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

您可以在这里找到许多选项.只需在页面中搜索WebSockets.

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


小智 13

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

网络套接字

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

长轮询

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

实时时钟

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

TCP“保证”每个数据包都会到达(灾难性网络故障除外),并且它们将始终按发送顺序到达。这对于记录分数、点击、聊天等关键信息非常有用。

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

在撰写本文时,WebSockets 可能是您最好的选择,尽管 WebRTC 的采用正在迅速扩大,并且在您完成游戏时实际上可能更可取,因此这是需要考虑的。


Gar*_*iss 9

我不确定WebSockets是否仍然是最近联网实时多人游戏的最佳工具(2017年). WebRTC是一种更新的技术,可提供更高性能的潜力.现在,由于以下库,WebRTC也更容易使用:

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

  • 如果我们需要一个权威的服务器,为了防止玩家作弊,WebRTC有作用吗?我们如何防止 WebRTC 作弊? (2认同)
  • 而且,发送二进制数据似乎是最快的。人们正在使用 WebSockets 对 JSON 进行(反)序列化。那不是很慢吗?如何才能在Web中建立一个权威的UDP网络呢? (2认同)

Pie*_*rre 7

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

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

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

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

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