Time 基于时间的引擎中的非线性事件

Time 基于时间的引擎中的非线性事件,time,mmo,Time,Mmo,在简单的“基于步长”图形引擎中,对象移动直接与帧速率相关联。这在20世纪80年代硬件完全相同时还不错 多年来,发动机一直是基于时间的,d=s/t。这意味着无论计算机的帧速率或功率如何,对象从A到B都需要相同的时间 如果一切都是以时间为基础的,我们如何执行角色被NPC击中时生命值减少x的动作?“命中”可能是每5秒一次 据我所知,这5秒的延迟被称为“心跳”。许多MMO都使用这样的心跳信号,这种心跳信号对很多动作都是全局性的 在基于时间的引擎中,“心跳”是用于非线性事件的最佳方法吗 更新: 谢谢你冗长

在简单的“基于步长”图形引擎中,对象移动直接与帧速率相关联。这在20世纪80年代硬件完全相同时还不错

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

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

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

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

更新:

谢谢你冗长的回复。如果可能的话,我会尽力澄清。 我试图决定MMO服务器使用哪些选项在内部模拟它所控制的世界

据我所知,系统中有3种主要的“刺激”会导致物体发生变化: 注意,这些仅在服务器内部

  • 线性综合作战。这些都是在游戏循环中完成的。例如,NPC从A移动到B

  • 客户端事件。就服务器而言,这些事件似乎是随机发生的。例如,用户单击fire

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


  • 第三步是我正在努力解决的问题,我想澄清一下这个方法是否正确。我希望这能澄清我的问题。

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

    但忽略所有这些,我将尝试回答最后一个问题:

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

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

    构建心跳信号

    正如你所说,如果不能依赖计算机系统的实时性(每秒时钟周期的精确数量、每条指令的时钟周期的精确数量、只有你的程序在运行、没有硬件中断等),那么产生这种心跳的时间可能会变得非常复杂。您也不能依赖系统或硬件计时器,或“线程睡眠”命令来实现稳定的心跳。如果你有不同的信仰:)

    你可以查看一些关于如何变得更灵活、心跳更稳定的想法。本文讨论如何构建一个时间“累加器”,并在积累足够的时间后启动更新/回调函数。它说的是触发物理更新的游戏循环,但最终游戏心跳也必须来自游戏循环

    如何处理心跳

    一旦你有了一个稳定的心跳,那么在上面实现游戏逻辑就会变得单调乏味。对于像《地震1》这样的游戏来说,每10毫秒为每个对象调用一次“思考”功能是很好的,但是在一个有更多对象的大型游戏中(比如MMO),它很快就会变得难以处理

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

    网络编程


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

    如果游戏循环有一个生产者/消费者模型,用于检测何时执行渲染/物理更新,那么可以想象的是,对于游戏更新和游戏计时器,您可以使用相同的模型。我不确定这是否能满足我的需要。基本上,我甚至不想在每一个游戏循环中检查HP,因为它每5秒才进入游戏。这样的事情超出了游戏循环的正常集成技术的范围。我在想,我有一个“状态检查”中断,每x毫秒检查一次类似的东西。这将是一个心跳(或心跳的倍数)。听起来好吗?好的,你的问题是“心跳是正确的方法吗?”答案是“是”。但是,要么你对心跳的定义完全错误,要么在某些游戏中实现了心跳的分级粒度(很有可能),要么你在规模上有很大差距。大多数实时游戏需要比每5秒更新一次全局游戏逻辑。想一想:如果你有一个你确信每秒被调用5次的函数,你会如何在它上面实现一个10秒的心跳?你能/会用较小的心跳做什么?@John:我想我们在你的提问和我的回答之间有很大的脱节。这是白板更适合的问题类型:)