【问题标题】:What faster alternatives do I have to websockets for a real-time web application?对于实时 Web 应用程序,我有什么比 websockets 更快的替代方案?
【发布时间】:2015-04-25 09:41:18
【问题描述】:

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

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

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

我知道“网络速度”之类的东西取决于连接,但我对“如果其他条件都相等”的情况感兴趣。

【问题讨论】:

  • 怎么会有比 websockets 更快的东西,它可以让你以几个字节的开销发送原始二进制文件? 30kb/s 对于普通大众来说也太大了,如果它与帧相关的话。
  • 我不知道这就是我问的原因。
  • 很公平,我的观点是,使用 websockets,您可以尽可能快地传输数据,并且尽可能减少延迟和开销。 30FPS 应该没问题,socket trips 通常在 10ms 以下(不包括 TTFB),除非你的服务器很远,在这种情况下它可能需要长达 15ms 才能走遍全球。 15ms*2=30ms 往返,1000ms/30ms=33.3FPS。运送纯 deltas 可能意味着运送一个键:值对,但是一个有序的值数组可能会“更便宜”,即使额外的逗号创建一个稀疏数组同时省略冗余元素。
  • 听起来不错。你可能想把它作为答案,这样我就可以投票了。
  • @dandavis,延迟时间比您想象的要长得多。跨大西洋(例如:NY-London)通常 > 100 毫秒。如果你很不幸(从网络工程的角度来看)住在新西兰,你可以期望至少 150 毫秒到/任何/便宜的基于数据中心的托管。许多大型电信公司都会公布历史往返时间。例如:verizonenterprise.com/about/network/latency

标签: javascript browser websocket network-programming


【解决方案1】:

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

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

您可以做一些其他事情来优化交通工具的使用:

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

  2. 只要有可能,不要通过发送、等待响应、再次发送、等待响应等来依赖连接的延迟......相反,尝试并行化操作,以便发送、发送、发送并在收到响应时对其进行处理。

  3. 调整来自服务器的传出数据包的设置,使其没有 Nagle 延迟,等待查看同一数据包中是否有其他数据。见Nagle's Algorithm。我认为您无法在浏览器中从客户端对此进行调整。

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

【讨论】:

  • 你总是有更多(不止两个)的选择 :) 你可以使用 flash 并创建普通的 tcp/udp 传输。
  • @PavelBucek - 我的回答是“来自标准浏览器”。 Flash 不是标准浏览器的一部分,并且在许多浏览器(如任何移动浏览器)中根本不起作用。我无法想象这些天来投资设计任何需要 Flash 的东西。如果你想那么远,你也可以谈谈 Java 插件。
  • 确实如此。我的想法更多的是关于 OP 范围 - 一个浏览器游戏。然后你会更频繁地使用闪光灯。或者类似 unity 的东西,它也提供网络支持。
  • @adamarold - 这是否很好地回答了您的问题?或者您还有其他问题需要解释吗?
猜你喜欢
  • 2013-12-18
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2013-08-16
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多