对于实时 Web 应用程序,我有什么比 websockets 更快的替代方法?

What faster alternatives do I have to websockets for a real-time web application?

我打算编写一款实时合作多人游戏。目前我正处于研究阶段。我已经编写了一个使用 websockets 的回合制游戏并且运行良好。

不过,我还没有尝试使用这种技术编写实时游戏。我的问题是关于 websockets 的。是否有另一种方法来处理(浏览器)客户端之间的通信?我的想法是让每个客户端都有游戏状态,并且只将增量发送给使用服务器作为 mediator/synchronization 工具的客户端。

我主要关心的是网络速度。我希望客户能够尽快收到彼此的动作,这样我的游戏就可以保持实时。我每秒大约有 20-30 帧,每帧数据不到 1 KB(这意味着每个客户端每秒最多 20-30 KB 数据)。

我知道像 "network speed" 这样的事情取决于连接,但我对 "if all else equals" 的情况很感兴趣。

对于标准浏览器,webSocket 将是您的最佳选择。仅有的两个选择是 webSocket 和 Ajax。两者都是 TCP 底层,因此一旦建立连接,它们几乎提供相同的传输。但是,webSocket 是一种持久连接,因此每次发送内容时都可以节省连接开销。再加上 webSocket 的持久连接允许您直接从服务器发送到您想要的客户端。

在典型的游戏设计中,底层游戏引擎需要适应服务器与任何给定客户端之间的传输速度。如果客户端的连接速度较慢,那么您必须减少发送给可以跟上的东西的数据包数量(在您的情况下可能更少的帧更新)。连接速度就是这样,所以你必须让你的应用程序以现有的速度提供最好的体验。

您可以做一些其他事情来优化传输的使用:

  1. 一次收集您需要发送的所有数据,并在一次较大的发送操作中发送,而不是大量的小发送。在 webSocket 中,不要发送三个单独的消息,每个消息都有自己的数据。相反,创建一封包含所有三封邮件信息的邮件。

  2. 只要有可能,不要通过发送、等待响应、再次发送、等待响应等方式依赖连接延迟...相反,尝试并行化操作,以便您发送、发送、发送,然后处理收到的响应。

  3. 调整从您的服务器传出数据包的设置,这样它们就没有 Nagle 延迟等待查看是否有其他数据进入同一个数据包。参见 Nagle's Algorithm。我认为您没有能力在浏览器中从客户端对此进行调整。

  4. 确保您的数据尽可能高效地编码以实现最小的数据包大小。