Wait for remaining time in interval rather than busy looping

This commit is contained in:
Camden Dixie O'Brien 2025-01-02 16:15:18 +00:00
parent 178d6a23d3
commit cda484c9ab

View File

@ -37,12 +37,11 @@ int main(int argc, char *argv[])
void *gamemem = calloc(1, game_conf.memsize); void *gamemem = calloc(1, game_conf.memsize);
game_init(argc, argv, gamemem, renderer); game_init(argc, argv, gamemem, renderer);
perf_t perf = { .freq = SDL_GetPerformanceFrequency() / 1000000.0 }; const uint64_t perfhz = SDL_GetPerformanceFrequency();
uint64_t frame = 0, prevt = SDL_GetTicks64(); const uint64_t intervalperf = (INTERVAL * perfhz) / 1000;
perf_t perf = { .freq = perfhz / 1000000.0 };
uint64_t frame = 0;
while (1) { while (1) {
const uint64_t t = SDL_GetTicks64();
const uint64_t dt = t - prevt;
if (dt >= INTERVAL) {
perf.start = SDL_GetPerformanceCounter(); perf.start = SDL_GetPerformanceCounter();
// Handle all events currently in queue // Handle all events currently in queue
@ -60,7 +59,7 @@ int main(int argc, char *argv[])
// Render frame // Render frame
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
game_render(gamemem, renderer, t); game_render(gamemem, renderer, SDL_GetTicks64());
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);
perf.render = SDL_GetPerformanceCounter(); perf.render = SDL_GetPerformanceCounter();
@ -79,12 +78,11 @@ int main(int argc, char *argv[])
evt, update, render, total, total_pc); evt, update, render, total, total_pc);
} }
// Increment frame counter and update time // Increment frame counter and wait until next interval
++frame; ++frame;
prevt = t; const uint64_t elapsed = SDL_GetPerformanceCounter() - perf.start;
} assert(elapsed < intervalperf);
SDL_Delay((1000 * (intervalperf - elapsed)) / perfhz);
SDL_Delay(INTERVAL / 8);
} }
quit: quit: