您是否要求一个基本上每 n 个刻度运行的循环?这听起来像一个Timer。BCL 中有几个计时器。一个用于服务器的计时器或一个用于 Window Forms的计时器。
您可以按照这些思路使用它们。以下是伪代码,旨在大致说明这是如何完成的。换句话说,如果您只是复制和粘贴,它可能不会编译。
public class RepeatingTask
{
public MyObjectState _objectState;
public RepeatingTask(Timespan interval)
{
Timer timer=new Timer(Timer_Tick); //This assumes we pass a delegate. Each timer is different. Refer to MSDN for proper usage
timer.Interval=interval;
timer.Start();
}
private DateTime _lastFire;
private void Timer_Tick()
{
DateTime curTime=DateTime.Now();
DateTime timeSinceLastFire = curTime-lastFireTime;
_lastFire=DateTime.Now(); //Store when we last fired...
accumulatedtime+=timeSinceLastFire
while(accumulatedtime>=physicsInterval)
{
Update(physicsInterval);
accumulated-=physicInterval;
}
}
}
您还可以使用闭包来包装定义计时器的方法的状态。
编辑
我读了这篇文章,我理解了这个问题;但是,您仍然可以使用计时器,但您需要按照他的指示设置您的函数,以便为您设置物理引擎的每个间隔调用引擎。
您是否使用 WPF,他们有一些我相信会以稳定的速度触发 doign 动画的事件。
编辑
我更新了我的代码示例以向您展示我的解释,但基本上您所做的是为您的物理引擎定义一个间隔,然后您在每次通过“循环/计时器”时需要做的事情是确定从那以后经过了多少实时时间最后一次迭代。然后,您将该增量存储在累加器中,您将使用该累加器进行倒计时,直到您为上次调用以来错过的所有间隔调用物理引擎。
我遇到的问题是,如果在这里使用计时器更好,那么让专用线程休眠,或者其他一些实现。