我有什么比Websockets更快的选择用于实时Web应用程序?

5
我计划编写一个实时合作多人游戏,目前我正在研究阶段。我已经编写了一个使用WebSockets的回合制游戏,并且它运行良好。
然而,我还没有尝试使用这种技术编写实时游戏。我的问题是关于WebSockets。是否有另一种处理(浏览器)客户端之间通信的替代方法?我的想法是在每个客户端上保留游戏状态,并仅使用服务器作为中介/同步工具向客户端发送增量。
我主要关注网络速度。我希望客户端能够尽快地接收到彼此的操作,以便我的游戏可以保持实时性。我每秒钟有大约20-30帧,每帧不到1K字节的数据(这意味着每个客户端每秒最多20-30K字节的数据)。
我知道像“网络速度”这样的东西取决于连接,但我对“如果其他条件相等”的情况感兴趣。

有什么东西能比WebSockets更快吗?WebSockets只需几个字节的开销就可以发送原始二进制数据。如果它与帧有关,那么每秒30kb的速度对于普通公众来说也太多了。 - dandavis
4
我不知道,所以我问了。 - Adam Arold
1
很好,我的观点是,使用Websockets可以像网络传输数据一样快速,并且延迟和开销最小。30FPS应该没有问题,套接字传输通常在10毫秒以下(不包括TTFB),除非您的服务器很远,否则可能需要多达15毫秒才能绕过地球大部分区域。 15ms * 2 = 30ms 往返,1000ms / 30ms = 33.3FPS。纯增量可能意味着发送一个键值对,但仅包含值的有序数组可能会更“便宜”,即使额外的逗号创建了一个稀疏数组,同时省略了冗余元素。 - dandavis
好的。你可以把它作为答案,这样我就可以点赞了。 - Adam Arold
@dandavis,延迟时间比你想象的要长得多。 跨大西洋(例如:纽约-伦敦)通常> 100ms。 如果你不幸(从网络工程师的角度来看)住在新西兰,你可以期望至少150ms到/任何/廉价数据中心托管。 许多大型电信公司发布历史往返时间。例如: http://www.verizonenterprise.com/about/network/latency/ - mrdunk
显示剩余4条评论
1个回答

12

从标准浏览器来看,webSocket 是您最佳的选择。唯一的两个替代方案是 webSocket 和 Ajax。二者在底层都是TCP,因此一旦建立连接,它们提供的传输功能几乎相同。但是,WebSocket 是一种持久连接,因此每次发送信息时都可以节省连接开销。此外,WebSocket 的持久连接允许您直接从服务器向客户端发送消息。

在典型的游戏设计中,底层游戏引擎需要适应服务器和任何给定客户端之间的传输速度。如果客户端连接速度较慢,则必须将要发送的数据包数减少到可以跟得上的水平(也许在您的情况下更新较少的帧)。连接速度就是它所是的,因此您必须使您的应用程序以现有的速度提供最佳体验。

还可以采取一些其他措施来优化传输的使用:

  1. 收集所有需要发送的数据并在一次较大的发送操作中发送,而不是进行许多小的发送操作。在 WebSocket 中,不要发送三个分别包含其自己数据的单独消息。而是创建一个包含所有三个消息中的信息的消息。

  2. 尽可能不要依赖连接的延迟通过发送,等待响应,再次发送,等待响应等操作。相反,尝试并行化操作,这样您就可以发送、发送、发送,然后处理随后到达的响应。

  3. 调整服务器从您发出的数据包的设置,以便不需要 Nagle 延迟等待看是否有其他数据要在同一个数据包中发送。参见 Nagle 算法。我认为您无法从客户端在浏览器中调整此项设置。

  4. 确保您的数据编码尽可能高效,以获得最小的数据包大小。


你总是有更多(两个以上)的选择 :) 你可以使用Flash并创建纯TCP/UDP传输。 - Pavel Bucek
1
@PavelBucek - 我的回答是“使用标准浏览器”。Flash不是标准浏览器的一部分,并且在许多浏览器(如任何移动浏览器)中根本无法使用。我无法想象在当今这个时代还会投资设计任何需要Flash的东西。如果你想更进一步,也可以谈论Java插件。 - jfriend00
足够正确。我的想法更多地涉及到OP范围——一个浏览器游戏。那么你更经常使用Flash。或者像Unity这样的东西,它也提供网络支持。 - Pavel Bucek
@adamarold - 这个回答解决了你的问题吗?还是你还有其他需要解释的问题? - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接