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 - либо непосредственно в потоке пользовательского интерфейса, либо сигнализируя о другом потоке.

Другие вопросы по тегам