summaryrefslogtreecommitdiff
path: root/kon/konprogram.c
diff options
context:
space:
mode:
authorKonAki <konaki@anokonaki.org>2026-10-10 23:29:00 +0800
committerKonAki <konaki@anokonaki.org>2026-10-10 23:29:00 +0800
commit438ad3a0bfe98dd3981f531f3d7bb45132166174 (patch)
tree502b604a68e2d05efbef5ccdb3155c4acb58adf9 /kon/konprogram.c
parent6938842f479c6af0aaa6999f4dccf0da06a3f610 (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.c16
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) {