最好的办法是实现一个游戏循环,该循环跟踪自上次循环迭代以来经过了多少时间,然后将经过的时间量传递给所有需要自我更新的实体。
例如,OpenTk实现了在每次通过游戏循环时发生的几个事件(例如 OnUpdateFrame、OnRenderFrame)。
这些事件中的每一个都传递了一个FrameEventArgs类型的参数,该参数具有一个 Time 属性:
/// <summary>
/// Gets a <see cref="System.Double"/> that indicates how many seconds of time elapsed since the previous event.
/// </summary>
public double Time
{
get { return elapsed; }
internal set
{
if (value <= 0)
throw new ArgumentOutOfRangeException();
elapsed = value;
}
}
根据经过的时间,您可以确定要在精灵中渲染的动画帧。
额外的好处是,通过查看这段时间,您可以计算出您当前正在运行的每秒帧数并根据它做出决策(跳过帧的渲染,降低渲染复杂性等)。