Node.js游戏逻辑

时间:2012-06-01 11:28:50

标签: node.js mmo

我正在制作实时多人赛车游戏。现在我需要帮助在Node.js TCP(网络)服务器上编写游戏逻辑。我不知道是否可能,我不知道我是否正确,但我正在努力。我知道很难理解我破碎的英语,所以我做了这个“绘画”:) 谢谢你的时间
Proccess

3 个答案:

答案 0 :(得分:4)

要详细说明driushkin的答案,您应该使用远程过程调用(RPC)和事件队列。这类似于您发布的图像,其中每个数据包代表一个“命令”或带有一些参数的RPC(即移动方向)。您还需要一个事件队列来确保按顺序和按时执行RPC。这将需要一个时间戳或帧数来执行每个命令(在未来的某个时间点,在一个简单的方案中)和同步手表(第二次世界大战风格)。

您可能会注意到此方案中的一个关键弱点:由于网络延迟,恶意用户等原因,RPC消息可能会延迟(应在应用之后到达)。在一个简单的方案中,会丢弃延迟的RPC。这很好,因为所有客户端(甚至是发起人!)等待服务器在执行之前发送RPC(如果发起客户端没有等待服务器消息,他的游戏状态将与服务器不同步,并且您的游戏将被打破)。

考虑滞后对这种方案的影响。假设客户端A到服务器的延迟是100毫秒,返回旅程也是100毫秒。这意味着客户端输入如下:

  • 客户端A按键,将RPC发送到服务器,但不在本地添加(0ms)
  • 服务器接收并重新广播RPC(100毫秒)
  • 客户A收到他自己的事件,现在最终将其添加到他的事件队列中进行处理(200ms)

正如您所看到的,客户在按下按键后1/5秒响应自己的事件。这是相当不错的100毫秒滞后。跨越延迟可以轻松超过200毫秒单向,拨号连接(罕见,但今天仍然存在)可能有滞后峰值> 500毫秒。如果你在局域网或类似的东西上玩,这一切都不重要,但在互联网上,这种反应迟钝可能是无法忍受的。

这就是客户端预测(CSP)的概念所在.CSP被认为是大而可怕的,但是正确实施并且经过深思熟虑它实际上非常简单。 CSP的有趣功能是客户端可以立即处理他们的输入(客户端预测会发生什么)。当然,客户可以(并且经常会)是错的。这意味着客户端需要一种从服务器应用更正的方法。这意味着您需要一种方法让服务器验证,拒绝或修改来自客户端的RPC请求,以及一种序列化游戏状态的方法(因此可以将其恢复为从中重新模仿的基点)。

有很多很好的资源可以做到这一点。我特别喜欢http://www.gabrielgambetta.com/?p=22,但你应该寻找一款好的多人游戏编程书。


即使在阅读了有关Flex和AS3的评论之后,我也必须建议socket.io。易用(以及与节点的简单集成)使其成为我曾经使用过的基于HTTP的网络游戏的最佳(最佳?)选项之一。我会做任何必要的调整才能使用它。我相信AIR / AS3至少有一个WebSockets库,即使socket.io本身不可用。

答案 1 :(得分:2)

这听起来像socket.io会很棒。它是一个库,可以在浏览器和服务器上为您提供实时的可能性。

答案 2 :(得分:1)

您可以在commands events中对此进行建模:客户端向服务器发送命令move,然后服务器验证此命令,如果一切正常,则发布事件{{1} }。

在你的情况下,可能不需要对P1进行不同的响应(好的,你可以移动)和其余的(P1正在移动),后者在两种情况下都足够了。 is moving事件应包含所有必要信息(如当前位置,速度等)。

在这种最简单的形式中,一个发出命令会遇到一些延迟,直到来自服务器的事件到来,并避免你可以立即开始移动,然后在事件到达时应用一些补偿操作。但这可能会变得复杂。