0

在简单的“基于步骤”的图形引擎中,对象移动直接与帧速率相关联。这在 1980 年代硬件相同时很好。

多年来,发动机一直“基于时间”,d=s/t。这意味着无论计算机的帧速率或功率如何,一个对象从 A 到 B 都需要相同的时间。

如果一切都是基于时间的,我们如何执行角色被 NPC 击中时生命值减少 x 的动作?“命中”可能是每 5 秒一次。

据我所知,这 5 秒的延迟称为“心跳”。许多 MMO 使用这样的心跳,这对于很多动作都是全局的。

在基于时间的引擎中,“心跳”是用于非线性事件的最佳方法吗?

更新:

感谢您的详细回复。如果可能的话,我会尽力澄清。我正在尝试决定 MMO 服务器使用哪些选项在内部模拟它控制的世界。

据我了解,系统中有 3 个主要的“刺激”会导致对象发生变化: 注意,这些仅在服务器内部。

  1. 线性集成操作。这些都是在游戏循环中完成的。例如 NPC 从 A 到 B 的移动。

  2. 客户端事件。就服务器而言,这些发生在看似随机的时间。例如用户点击开火。

  3. 基于时间。这些以心跳间隔发生。例如,检查任何空闲的 NPC 并给他们一些事情做。

第 3 步是我正在努力解决的问题,并希望澄清这种方法是否正确。我希望这能澄清我的问题。

4

1 回答 1

1

这个问题有点困难,因为它目前的措辞是模棱两可的。答案可能与游戏循环、网络服务器架构、网络客户端架构、游戏逻辑等有关。

但是忽略这一切,我将尝试回答最后一个问题:

在基于时间的引擎中,“心跳”是用于非线性事件的最佳方法吗?

某种形式的“心跳”是实现基于时间的系统的最低级别方式。但是如果不知道您的特定系统或游戏的要求,我不能告诉您它就足够了。

构建心跳

正如你所说,如果不能依赖计算机系统的实时性(每秒准确的时钟周期数,每条指令的准确时钟周期数,只有你的程序运行,没有硬件中断等),时间生成这种心跳可能会变得更加复杂。您也不能依靠系统或硬件计时器,或“线程睡眠”命令来实现稳定的心跳。 如果您有不同的看法,请参阅这篇关于 Win32 计时的文章:)

您可以查看这篇热门文章,了解有关如何变得更灵活、让心跳更稳定的一些想法。这篇文章讨论了构建一个时间“累加器”,一旦积累了足够的时间,就会启动一个更新/回调函数。它谈论的是触发物理更新的游戏循环,但最终游戏心跳也必须源于游戏循环。

心跳怎么办

一旦你有一个稳定的心跳,那么在它之上实现游戏逻辑就会变得乏味。对于像 Quake 1 这样的游戏来说,为每个对象每 10 毫秒回调一次的“思考”功能可以正常工作,但在具有更多对象的大型游戏(如 MMO)中,它很快就会变得难以处理。

您可以在此基础上构建的更高级别的机制是“计时器”或“秒表”,它会在时间过去后调用自定义的每个计时器回调函数,或者定期(例如每 5 秒)调用它。这样你就可以用一种通用的方式来检查你的时间(“现在还有 5 秒吗?”),让你的游戏逻辑只实现它关心的事情。

网络编程

像 MMO 这样的网络游戏会比这更复杂。你提到了 MMO,但没有提到网络延迟、有损、客户端/服务器同步问题等。所以我不会在这里详细介绍。这很方便,因为充分回答这些问题可能会写满一篇大文章,如果不是一本书的话。

于 2011-08-15T21:22:17.273 回答