Проблема с заиканием игрового цикла - PullRequest
0 голосов
/ 13 октября 2019

Итак, у меня есть этот независимый от частоты кадров игровой цикл. Это код:

//time keeping variables
const double UPDATE_RATE = 16.666667;
double total_time = 0;
double current_time = gTimer.time_since_start();
double frame_time = 0;
double new_time = 0;

//main loop
while(gGame_manager.game_is_running()){
    new_time = gTimer.time_since_start();
    frame_time = new_time - current_time;
    current_time = new_time;
    total_time += frame_time;

    if(total_time >= UPDATE_RATE){
        gInput_manager.update();
        do{
            gGame_manager.update();
            gPhysics_manager.update(&gGame_manager.get_level()->entities);
            total_time -= UPDATE_RATE;
        }
        while (total_time >= UPDATE_RATE);

        gAssets_manager.update();
        gDisplay_manager.update();
        gAudio_manager.update();
    }
    gConsole.update();
    gFps.update(current_time, 1000/frame_time);
    gDrawing_manager.update(*gGame_manager.get_level(), gFps.get_value(), gConsole);
}

Реализация gTimer.time_since_start () выглядит следующим образом: std::chrono::duration<double> elapsed_seconds = std::chrono::high_resolution_clock::now() - start;

Таким образом, цикл работает нормально, однако очень часто игра заикается(мы привязаны к ~ 60 кадрам в секунду с помощью v-sync). По мере выполнения цикла total_time становится равным 0, и я думаю, что именно тогда игра заикается, поскольку пропустит обновление. Я попытался реализовать интерполяцию кадров, но это не помогло (возможно, я сделал это неправильно). В рендеринге используется SDL2.

У кого-нибудь есть предложения по устранению проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...