Я получаю неожиданное поведение, которое я не понимаю. Я пытаюсь реализовать фиксированный переменный временной шаг, как описано на http://gafferongames.com/game-physics/fix-your-timestep/ и http://gameprogrammingpatterns.com/game-loop.html. Мой внутренний цикл while никогда не оценивается как истинный, когда я запускаю программу в Visual Studio; однако, когда я раскомментирую 'this_thread::sleep_for(1s)', цикл while будет оцениваться как истина после того, как внешний цикл будет выполнен примерно 10 раз. Я бы ожидал, что на более быстрых машинах это будет ожидаемый результат.
Итак, мой вопрос: почему внутренний цикл оценивается как истинный только тогда, когда «this_thread::sleep_for(1s)» раскомментирован? Не должно ли lagTime становиться больше, чем fixedDeltaTime, независимо от sleep_for? Математика занимает слишком много времени для компьютера или что-то в этом роде?
int updateCount = 0;
double CLOCKS_PER_MILLISECOND((double)CLOCKS_PER_SEC * 1000.0);
double previousTime = std::clock() / CLOCKS_PER_MILLISECOND;
double newTime = 0, deltaTime = 0, lagTime = 0;
double fixedDeltaTime = 1.0 / 60.0;
while (gameIsRunning)
{
newTime = std::clock() / CLOCKS_PER_MILLISECOND;
deltaTime = newTime - previousTime;
previousTime = newTime;
lagTime += deltaTime;
inputSystem.update();
sceneManager.update();
while(lagTime >= fixedDeltaTime) // never evalutes as true?
{
physicsSystem.update();
lagTime -= fixedDeltaTime;
updateCount++;
}
std::cerr << "-----" << updateCount << "-----" << std::endl;
physicsSystem.interpolate(lagTime / fixedDeltaTime);
renderSystem.update();
audioSystem.update();
updateCount = 0;
//std::this_thread::sleep_for(1s);
}
Спасибо за любую помощь!