Итак, у меня есть этот независимый от частоты кадров игровой цикл. Это код:
//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.
У кого-нибудь есть предложения по устранению проблемы?