【问题标题】:deltaTime as a local variable on each object, or a single shared variable?deltaTime 作为每个对象的局部变量,还是单个共享变量?
【发布时间】:2016-01-06 06:29:07
【问题描述】:

假设我有一个带有 Update() 方法的 GameWorld。除了我的 GameWorld,我还有一个带有 Update() 方法的 GameObject 类。

GameWorld 有我的 GameObject 类的 0..* 个实例,GameWorld 中的 Update() 方法对我的 GameWorld 中的所有 GameObjects 调用 Update()。

我需要在我的每个游戏对象中使用 deltaTime,这是我的问题: 是否可以在我的 GameWorld 中创建一个 deltaTime,并让所有游戏对象通过 GameWorld 来访问一个 deltaTime。这个 deltaTime 将在 GameWorld 的 Update() 中更新。

或者最好在 GameObject 类中创建一个本地 deltaTime 变量,以便每个对象都有自己的 deltaTime,并让每个 GameObject 上的 Update() 处理 deltaTime?

做一个或另一个有什么优点或缺点,还是会给我同样的结果?

【问题讨论】:

    标签: c# timedelta


    【解决方案1】:

    我认为为每个GameObject 分配一个deltaTime 会更好。如果您有大量对象并且其Update() 函数内的计算需要大量时间,则GameWorlddeltaTime 可能与自对象上次更新以来实际经过的时间不同。此外,根据您选择实施程序的方法,每个对象的时间差异可能不同,这可能会导致额外的复杂性。

    例如,假设您有两个GameObject 实例。调用GameWorld.Update() 并计算deltaTime。现在,如果第一个对象的更新时间出乎意料地长,那么第二个对象将收到一个deltaTime,它小于自上次更新以来经过的实际时间。此外,在下一次更新中,第一个对象将收到一个大于实际值的deltaTime

    在我看来,你应该这样做:

    class GameObject
    {
       DateTime lastUpdate;
    
       void Update()
       {
          TimeSpan deltaTime = DateTime.Now - lastUpdate;
    
          ...
       }
    }
    

    计算成本和内存的开销可以忽略不计,虽然deltaTime 的“静态”实现在大多数情况下可能就足够了,但上面的代码可以让您免于以后的很多麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多