Farseer Physics не-XNA в отдельном потоке
Я разрабатываю игру на C# с Farseer Physics без XNA. я кладу world.Step(float dt)
в отдельном потоке, чтобы сохранить форму (фактически, цикл while блокировал бы все остальные операции). Ну, шар, динамическое тело, работает быстрее или медленнее, в зависимости от частоты процессора, я думаю. Я думал о Thread.Sleep()
с задержкой, рассчитанной путем считывания частоты процессора и умножения ее на что-то, но я почти уверен, что ошибаюсь. Я немного нуб. Любое предложение?
1 ответ
Thread.Sleep
это очень не точный способ времени вещей. Вы хотите использовать что-то вроде:
Stopwatch timer = new Stopwatch();
timer.Start();
Который вы можете затем использовать для запуска цикла обновления по времени:
// Run enough updates to catch up to the current time
private void Idle()
{
double time = timer.Elapsed.TotalSeconds;
accumulatedTime += (time - lastTime);
lastTime = time;
const double frameTime = 1.0/60.0; // 60 frames per second
while(accumulatedTime > frameTime)
{
world.Step((float)frameTime);
accumulatedTime -= frameTime;
}
}
Вы можете позвонить выше Idle
метод с последующим коротким Sleep
в петле.
Или вы можете просто вызвать его из обработчика событий для Application.Idle
- либо непосредственно в потоке пользовательского интерфейса, либо сигнализируя о другом потоке.