Только оценивается как True, когда поток спит

Я получаю неожиданное поведение, которое я не понимаю. Я пытаюсь реализовать фиксированный переменный временной шаг, как описано на 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);
}

Спасибо за любую помощь!


person leaflet757    schedule 04.02.2016    source источник


Ответы (1)


Вы пытаетесь измерить время с помощью clock(), но это счетчик тиков процесса, который не будет продвигаться вперед, пока все потоки в вашем процессе находятся в спящем режиме. Весь смысл sleep в том, чтобы сказать процессору: «Не обращайте на этот процесс никакого внимания на некоторое время!». Что касается вашей программы, время замирает, пока оно спит.

Если бы вы ждали достаточно долго, lagTime в конце концов продвинулось бы дальше fixedDeltaTime, потому что период времени, в течение которого ваша программа не находится в спящем режиме, потребляет такты... но вам придется ждать много-много секунд.

Не используйте clock() для измерения абсолютного течения времени.

person Lightness Races in Orbit    schedule 04.02.2016
comment
Спасибо. Я этого не понимал. Я переключил часы() на использование функции SDL SDL_GetTicks(), и это решило проблему. Есть ли стандартный способ С++ для получения абсолютного времени? Спасибо! - person leaflet757; 04.02.2016
comment
@leaflet757: только если ваш компилятор достаточно новый stackoverflow.com/a/26651148/560648 - person Lightness Races in Orbit; 04.02.2016