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 的采用正在迅速扩大,并且在您完成游戏时实际上可能更可取,因此这是需要考虑的。
我不确定WebSockets是否仍然是最近联网实时多人游戏的最佳工具(2017年). WebRTC是一种更新的技术,可提供更高性能的潜力.现在,由于以下库,WebRTC也更容易使用:
或者,如果您想要避免网络实现的实际细节,并且您正在寻找提供更高级别多人界面的库,请查看Lance.gg.(免责声明:我是贡献者之一).
多人游戏要求服务器向客户端发送世界状态的定期快照.在浏览器HTML/js应用程序的上下文中,您几乎没有选择:轮询,websocket或编写自己的插件来扩展浏览器功能.
诸如BOSH或Bayeux之类的HTTP轮询很复杂,但会引入网络开销和延迟.websocket旨在克服其限制,并且肯定更具响应性.
诸如cometd或socket io之类的库提供了传输的抽象,并为您解决了浏览器兼容性问题.最重要的是,它允许在底层传输之间切换并毫不费力地比较它们的性能.
我使用socket.io 编写了多人街机游戏,通常使用websocket测量2ms延迟,使用xhr-polling在lan上测量约30ms.这对于多人游戏来说已经足够了.
我建议你看看nodejs和socket.io,以便能够在客户端和服务器之间共享代码,你也可以在[ 3 ] 借用一些多人游戏代码.
| 归档时间: |
|
| 查看次数: |
31572 次 |
| 最近记录: |