如何有效地检查发生事件的时间?

时间:2017-10-07 08:33:15

标签: events unity3d

这是一个关于计算机如何根据时间触发器启动任务的更大问题。

我正在使用运行游戏时钟的GameManager单例实例在Unity中构建游戏。我希望事件在整个游戏过程中定期发生,但是通过一系列if语句运行时间变量以了解事件何时发生似乎效率低且反直觉。

我也一直在开发移动应用程序,我一直想知道警报是如何工作的(这与上述情况类似吗?)。设备/基础任务是否在当天24小时运行并等待检查if语句的等效内容以了解何时提醒警报事件?

1 个答案:

答案 0 :(得分:1)

您所描述的基本上是计算机如何处理事件。大多数事件驱动的程序,包括操作系统本身都使用所谓的池系统,系统将抛出所有现有事件的大量列表,并检查它们的触发条件是否得到满足。该触发条件可以是时间或其他触发,例如从诸如键盘或网卡的设备接收的输入。

Unity引擎实际上也是这样做的。在幕后,Unity将有一个主要过程,不断检查所有内置monobehaviour方法的射击条件是否已经满足,然后如果有的话就触发方法。例如,FixedUpdate方法保证每秒被调用很多次,我相信它每秒30次,但我不确定我的头脑。所以固定更新的调用方法就是这样的。

timer += Time.deltaTime();
while(timer >= (1.0f/30.0f))
{
    FixedUpdate();
    timer -= (1.0f/30.0f);
}  

此代码将按处理器允许的频率运行,不断检查是否有足够的时间来执行另一个对FixedUpdate()的调用,此代码也执行回溯,因此如果处理器过载并且此代码未被调用比如说2秒然后在下次被调用时它将执行足够的2秒钟的调用。

现在对于你的团结应用,如果这将是小班级,只说大约10个时间条件,那么我只会使用if语句,你建议不止于此,我会开始考虑采取更多的oop方法,并有一个抽象类有两种方法

abstract class ConditionEvent{
    bool ConditionMet();
    void Process();
} 

然后在你的MonoBehavour调用中,我将有一个填充这些类的列表,其中包含一个调用ConditionMet函数的循环。如果函数返回true,则调用Process。