4

我正在制作实时多人赛车游戏。现在我需要帮助在 Node.js TCP(网络)服务器中编写游戏逻辑。我不知道这是否可能,我不知道我是否做得对,但我正在尽我所能。我知道很难理解我蹩脚的英语,所以我做了这幅“画”:)
谢谢你的时间
过程

4

3 回答 3

4

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

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

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

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

如您所见,客户端在按下键后 1/5 秒内对自己的事件做出反应。这是相当不错的 100 毫秒延迟。单程跨洋延迟很容易超过 200 毫秒,拨号连接(很少见,但今天仍然存在)可能会出现 > 500 毫秒的延迟峰值。如果您在 LAN 或类似的地方玩游戏,这些都不重要,但在互联网上,这种无响应可能是无法忍受的。

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

有很多关于这样做的好资源。我特别喜欢http://www.gabrielgambetta.com/?p=22,但你真的应该寻找一本好的多人游戏编程书籍。


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

于 2012-06-01T16:02:02.237 回答
2

这听起来像是socket.io非常适合的东西。它是一个库,可为您在浏览器和服务器上提供实时可能性。

于 2012-06-01T11:34:59.173 回答
1

您可以将其建模commandsevents:客户端向move服务器发送命令,然后服务器验证此命令,如果一切正常,他会发布事件is moving

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

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

于 2012-06-01T11:55:38.903 回答