假设您有一个游戏,其中有许多实体(许多)服务于某些功能,但并非总是需要或需要在每个框架中都考虑所有这些功能。我正在研究的具体问题是存在一个包括器官在内的人体的详细模拟。
在游戏中,每个生物都有自己的身体,身体分成较小的部分(躯干,腿等),有时这些部分包含器官,这些器官在体内发挥特定的功能。器官的当前用途或作用是未知的。毕竟,动物可能肚子空了,因此不需要消化任何东西。当您在世界上拥有许多生物时,检查或模拟每个帧中的每个对象将是非常荒谬的,而且成本很高。因此,我正在考虑一种巧妙地区分需要更新的对象和不需要更新的对象的方法。
我想出的似乎是至少可以的解决方案。它创建了一个简单的队列/堆栈(本质上是每个元素在读取后即被删除;顺序无关紧要),称为“注意堆栈”,其中需要模拟的对象驻留在该堆栈中。需要注意的对象将简单地放在堆栈上或由其他对象放在那里。这些对象可能会实现带有Simulate()函数的简单接口。
应用于我之前的消化示例,这将意味着:
玩家从清单中选择要吃的东西(假设是面包),并将其放入角色的口中,然后将口放到注意堆栈中。在下一帧中,将嘴从堆栈中取出,并调用其Simulation()函数。由于是嘴巴,因此在这里模拟咀嚼是合理的。这可能会持续几帧,在此过程中,嘴巴会不断将自身放到烟囱上,直到它决定可以吞咽食物为止。在这种情况下,嘴巴将嚼过的面包放进胃中(我知道它不会直接进入胃中,但是为了简化起见,食管被省去了),然后也将其放到注意堆栈中。在下一帧中,开始消化过程的模拟。其余的必要器官等等。
可以预见的问题是空转对象。熟睡的动物就是一个很好的例子。可以通过将熟睡的动物放在堆栈上并每次检查是否需要唤醒来完成上述操作,但这似乎很浪费,因为这是唯一要做的事情。为了使闲置对象更有效率,我计划添加一种时间表,以存储要在特定时间执行的作业。如果动物入睡,它将按照该时间表进行工作,该时间表将在动物入睡后的一定时间内进行。然后,这项工作将负责将熟睡的动物再次放到注意堆栈中。现在,您可以说不在注意力集中的睡眠动物可能会因为没有模拟AI而错过被某物攻击的机会,
现在,老实说,由于缺乏经验,我不知道这是否可以完美解决该问题。我接近可用的东西了吗?通常这是如何完成的,或者有人有什么建议或更好的解决方案?