【问题标题】:How to efficiently check the time to fire an event?如何有效地检查触发事件的时间?
【发布时间】:2017-10-07 08:33:15
【问题描述】:

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

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

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

【问题讨论】:

  • Unity 的MonoBehaviour 为此提供了Invoke、InvokeRepeating 和StartCoroutine 函数。有关详细信息,请参阅手册。如果我没有完全弄错,也有官方提供的教程(如果没有,ytube 上有很多)。

标签: events unity3d


【解决方案1】:

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

Unity 引擎实际上也是这样做的。在幕后,Unity 将有一个主进程不断运行,检查是否满足所有内置单行为方法的触发条件,如果满足则触发这些方法。例如,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。

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 2013-07-31
    • 2014-04-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多