diff options
| author | KonAki <konaki@anokonaki.org> | 2026-10-10 23:29:00 +0800 |
|---|---|---|
| committer | KonAki <konaki@anokonaki.org> | 2026-10-10 23:29:00 +0800 |
| commit | 438ad3a0bfe98dd3981f531f3d7bb45132166174 (patch) | |
| tree | 502b604a68e2d05efbef5ccdb3155c4acb58adf9 /kon/konprogram.c | |
| parent | 6938842f479c6af0aaa6999f4dccf0da06a3f610 (diff) | |
program: time each part of the frame, cap fps instead of fixed sleep
Diffstat (limited to 'kon/konprogram.c')
| -rw-r--r-- | kon/konprogram.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/kon/konprogram.c b/kon/konprogram.c index 31fe7b6..a87aee8 100644 --- a/kon/konprogram.c +++ b/kon/konprogram.c @@ -110,7 +110,7 @@ static void kon_frame_(void *data) { const kon_programConfig_t *config = &state->config; kon_display_t *display = program->display; kon_event_t ev; - kon_time now, dt; + kon_time now, dt, t0, t1, t2, t3, t4, cap; while (kon_pollEvent(program->window, &ev)) { if (kon_debugFeedEvent(program->debug, &ev)) continue; @@ -131,17 +131,29 @@ static void kon_frame_(void *data) { else kon_setWindowPos(program->window, state->shakeX, state->shakeY); } + t0 = kon_getTime(); if (config->update) config->update(program, dt, config->user); + t1 = kon_getTime(); kon_clearFramebuffer(display->game, KON_BACKGROUND_COLOR); if (config->draw) config->draw(program, display->game, config->user); + t2 = kon_getTime(); kon_presentDisplay(display); + t3 = kon_getTime(); if (config->drawScreen) config->drawScreen(program, display->screen, config->user); kon_debugFrame(program->debug); if (kon_debugQuitRequested(program->debug)) kon_setShouldClose(program->window, true); kon_debugDraw(program->debug, display->screen); + t4 = kon_getTime(); kon_blitPixels(program->window, display->screen->data, display->screen->width, display->screen->height); - kon_sleep(0.008); + kon_debugTimes(program->debug, t1 - t0, t2 - t1, t3 - t2, kon_getTime() - t4); + + /* only wait out what is left of the frame, a fixed sleep eats time the frame could use */ + if (config->maxFps >= 0) { + cap = 1.0 / (config->maxFps > 0 ? config->maxFps : 120); + dt = kon_getTime() - now; + if (dt < cap) kon_sleep(cap - dt); + } } void kon_programQuit(kon_program_t *program) { |
