2015-02-23 39 views
3

我打算写一个实时合作多人游戏。目前我正处于研究阶段。我已经写了一个基于回合的游戏,它使用websockets并且工作正常。对于实时Web应用程序,我有哪些更快的替代方法?

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

我主要关心的是网络速度。我希望客户能够尽可能快地接收对方的行为,这样我的游戏就可以保持实时。我每秒大约有20-30帧,每帧的数据少于一千字节(这意味着每个客户端每秒最多可以有20-30千字节的数据)。

我知道像“网络速度”这样的事情取决于连接,但我对“如果其他所有事情平等”的情况感兴趣。

+0

怎么可能比websockets更快,它可以让你只用几个字节的开销发送原始二进制文件?对于大众来说,30kb/s也太多了,如果它与帧相关的话。 – dandavis 2015-02-23 23:04:35

+3

我不知道这就是我问的原因。 – 2015-02-24 11:27:17

+1

足够公平,我的观点是,使用websockets,您可以像网络一样快速地发送数据,并且尽可能减少延迟和开销。30FPS应该没有问题,套接字行程通常在10ms以下(不包括TTFB),除非您的服务器距离很远,在这种情况下,大部分时间可能需要长达15ms才能到达全球。 15ms * 2 =往返30ms,1000ms/30ms = 33.3FPS。运送纯粹的增量可能意味着运送一个关键字:值对,但是有序的值数组可能会“便宜”,即使额外的逗号创建了一个稀疏数组,同时省略了多余的元素。 – dandavis 2015-02-24 21:02:31

回答

10

从一个标准的浏览器,webSocket将是你最好的选择。唯一的两种选择是webSocket和Ajax。两者都是TCP封装,所以一旦建立连接,它们几乎可以提供相同的传输。但是,webSocket是一个持久连接,所以每次你想发送一些东西时都可以节省连接开销。再加上webSocket的持久连接允许你直接从服务器发送到你想要的客户端。

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

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

  1. 收集你需要在同一时间发送和在一个较大的发送操作发送,而不是很多小发送的所有数据。在webSocket中,不要发送三个单独的消息,每个消息都有自己的数据。相反,请创建一条包含来自所有三条消息的信息的消息。

  2. 只要有可能,不要通过发送,等待响应,再次发送,等待响应等来依赖连接延迟......而是尝试并行化操作,以便发送,发送和发送然后处理响应。

  3. 调整您的服务器传出数据包的设置,使它们不是Nagle延迟,等待查看是否有其他数据要放入同一个数据包。见Nagle's Algorithm。我不认为你有能力在浏览器中从客户端调整它。

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

+0

您总是会有更多(两种)​​替代方案:)您可以使用闪存并创建纯tcp/udp传输。 – 2015-02-24 06:39:55

+1

@PavelBucek - 我的答案是“来自标准浏览器”。 Flash不是标准浏览器的一部分,从许多浏览器(如任何移动浏览器)根本无法使用。我无法想象现在投资设计任何需要Flash的东西。如果你想要那么远,你也可以谈论Java插件。 – jfriend00 2015-02-24 06:48:46

+0

够正确。我的想法更多的是OP范围 - 一个浏览器游戏。然后你更频繁地使用闪光灯。或者像团结一样,这也提供了网络支持。 – 2015-02-24 07:35:05

相关问题