Вы запрашиваете цикл, который будет работать в основном каждые n тиков? Это звучит как Таймер . В BCL есть пара таймеров. таймер для серверов или один для оконных форм .
Вы можете использовать их по этим направлениям. Ниже приведен код psuedo, предназначенный для общего представления о том, как это делается. Другими словами, он, вероятно, не скомпилируется, если вы просто скопируете и вставите.
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, у них есть некоторые события, которые, я полагаю, запускаются с постоянной скоростью для обычных анимаций.
Редактировать
Я обновил пример кода, чтобы показать вам мою интерпретацию, но в основном вы определяете интервал для вашего физического движка, а затем то, что вам нужно делать на каждом проходе через «цикл / таймер», определяет, насколько реально время прошло с последней итерации. Затем вы сохраняете эту дельту в Accumalator, который будете использовать для обратного отсчета до тех пор, пока вы не вызовете свой физический движок для всех интервалов, которые вы пропустили с момента последнего вызова.
С чем я борюсь, так это с тем, чтобы лучше использовать таймер, а затем иметь спящий выделенный поток или какую-то другую реализацию.