Javascript WebSocket适合实时多人游戏吗?
我对构建一个小型实时多人游戏感兴趣,客户端使用HTML5/JavaScript,服务器软件可能使用Java 我对WebSocket进行了一些研究,但似乎我对WebSocket实际上是什么存在误解。我最初认为WebSocket只是JavaScript处理TCP套接字的一种方式,就像Java和其他语言中使用的那样,但似乎必须进行整个握手过程,每次传输都包含大量HTTP开销(在这种情况下,Ajax的好处似乎没有初看上去那么令人兴奋)?Javascript WebSocket适合实时多人游戏吗?,javascript,websocket,multiplayer,Javascript,Websocket,Multiplayer,我对构建一个小型实时多人游戏感兴趣,客户端使用HTML5/JavaScript,服务器软件可能使用Java 我对WebSocket进行了一些研究,但似乎我对WebSocket实际上是什么存在误解。我最初认为WebSocket只是JavaScript处理TCP套接字的一种方式,就像Java和其他语言中使用的那样,但似乎必须进行整个握手过程,每次传输都包含大量HTTP开销(在这种情况下,Ajax的好处似乎没有初看上去那么令人兴奋)? 在相关主题中,是否有更好的WebSocket替代方案(JavaSc
在相关主题中,是否有更好的WebSocket替代方案(JavaScript中的实时多人游戏)?WebSocket是在web浏览器中运行的实时多人游戏的最佳解决方案。正如评论中所指出的,在HTTP连接升级的情况下会有一次初始握手,但一旦连接建立,WebSocket为服务器和客户端之间的双向通信提供了最低延迟的连接机制 我建议你看这个: 看看:
- 此处提供的代码:
也来看看。根据游戏的目的以及您是否需要服务器来管理游戏状态,您可以使用此技术进行点对点通信。您可能仍然需要一个解决方案来处理将玩家分组的问题—在这种情况下,WebSocket是最快/最好的解决方案。多人游戏要求服务器定期向客户端发送世界状态的快照。在浏览器HTML/js应用程序的上下文中,您几乎没有选择:轮询、websocket或编写自己的插件来扩展浏览器功能 HTTP轮询(如或)非常复杂,但会引入网络开销和延迟。websocket是为了克服它们的局限性而设计的,它的响应性肯定更高 库(如或)提供了传输的抽象,并为您解决了浏览器兼容性问题。最重要的是,它允许在底层传输之间切换并比较它们的性能,而无需付出任何努力 我用socket.io编码,通常用websocket测量2ms的延迟,用局域网上的xhr轮询测量30ms左右的延迟。这对于多人游戏来说已经足够了
我建议您查看一下和socket.io,以便能够在客户端和服务器之间共享代码,您还可以在[]处借用一些多人游戏代码。如果您计划在游戏中使用JavaScript(就像您一样),那么WebSocket是您的最佳选择。如果您想支持旧版本的Internet Explorer,请考虑Microsoft开发的Signal R系统。他们在引擎盖下使用WebSocket,但他们也有一些备用选项…所以协议将使用可用的最佳解决方案
我不确定WebSocket是否仍然是最好的网络工具 这几天(2017年)的实时多人游戏。这是一项新技术 这提供了更高性能的潜力。这些呢 如今,由于以下库,WebRTC也更易于使用:
- 简化服务器端网络
- 它还提供了一个服务器端库,正如其名称所示,速度可能更快
- 提供了一个实现,如果您想使用
或者,如果您不想了解网络实现的实际细节,并且您正在寻找一个提供更高级别的多人界面的库,请查看。(免责声明:我是撰稿人之一)。基本上,在撰写本文时,您有3种选择: WebSocket WebSockets是一种轻量级消息传递协议,它利用TCP,而不是TCP套接字的Javascript实现,如您所述。但是,除了初始握手之外,没有HTTP头在该点之间来回传递。一旦建立了连接,数据就可以以最小的开销自由地传递 长轮询 简言之,长轮询涉及客户端使用HTTP请求定期轮询服务器以获取新信息。这在CPU和带宽方面非常昂贵,因为每次都要发送一个新的HTTP头。对于较旧的浏览器,这基本上是您唯一的选择,在这些情况下,库(如)使用长轮询作为备用方法 WebRTC 除了前面提到的内容之外,WebRTC还允许通过UDP进行通信。UDP由于其低开销(相对于TCP)、低延迟和无阻塞特性,长期以来一直被用于非基于web的环境中的多人游戏中 TCP“保证”每个数据包都会到达(除了灾难性的网络故障),并且它们总是按照发送顺序到达。这对于记录分数、点击率、聊天等关键信息非常有用 另一方面,UDP没有这样的保证。数据包可以以任何顺序到达,也可以完全不到达。当涉及以高频率发送且需要尽快到达的不太关键的数据时,这实际上很有用,例如球员位置或输入。原因是,如果单个数据包在传输过程中延迟,TCP流将被阻止,从而导致游戏状态更新出现较大的间隔。使用UDP,您可以简单地忽略延迟到达的数据包(或者根本没有),然后继续接收下一个数据包,为玩家创造更流畅的体验 在撰写本文时,WebSockets