summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonAki <konaki@anokonaki.org>2026-10-10 23:36:13 +0800
committerKonAki <konaki@anokonaki.org>2026-10-10 23:36:13 +0800
commit625108a3c9d4ebf99be30296aef10d60b272b7a7 (patch)
treee0e49bf65471b1aee1e052082ac4837aa485fd6d
parent438ad3a0bfe98dd3981f531f3d7bb45132166174 (diff)
program: runtime fps cap and maxfps command
-rw-r--r--kon/konprogram.c14
-rw-r--r--kon/konprogram.h1
2 files changed, 13 insertions, 2 deletions
diff --git a/kon/konprogram.c b/kon/konprogram.c
index a87aee8..2229c00 100644
--- a/kon/konprogram.c
+++ b/kon/konprogram.c
@@ -89,6 +89,14 @@ static void kon_cmdShake_(kon_debug_t *debug, void *user, int argc, char **argv)
state->shakeLeft = 0.5f;
}
+static void kon_cmdMaxFps_(kon_debug_t *debug, void *user, int argc, char **argv) {
+ kon_programState_t *state = user;
+
+ (void)debug;
+ if (argc > 1) state->pub.maxFps = atoi(argv[1]) > 0 ? atoi(argv[1]) : -1;
+ kon_debugLog(debug, "maxfps %d", state->pub.maxFps);
+}
+
static void kon_addWindowCommands_(kon_programState_t *state) {
kon_debug_t *debug = state->pub.debug;
@@ -97,6 +105,7 @@ static void kon_addWindowCommands_(kon_programState_t *state) {
kon_debugCommand(debug, "borderless", "borderless 0 or 1", kon_cmdBorderless_, state);
kon_debugCommand(debug, "clickthrough", "clickthrough 0 or 1", kon_cmdClickThrough_, state);
kon_debugCommand(debug, "message", "message \"text\"", kon_cmdMessage_, state);
+ kon_debugCommand(debug, "maxfps", "frame cap, 0 for none", kon_cmdMaxFps_, state);
kon_debugCommand(debug, "shake", "shake the window", kon_cmdShake_, state);
}
@@ -149,8 +158,8 @@ static void kon_frame_(void *data) {
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);
+ if (program->maxFps >= 0) {
+ cap = 1.0 / (program->maxFps > 0 ? program->maxFps : 120);
dt = kon_getTime() - now;
if (dt < cap) kon_sleep(cap - dt);
}
@@ -204,6 +213,7 @@ int kon_programRun(const kon_programConfig_t *config) {
}
#endif
#ifdef KON_MODULE_DEBUG
+ program->maxFps = config->maxFps;
program->debug = kon_debugCreate(program->font);
kon_debugSetAssets(program->debug, program->assets);
#ifdef KON_DEVELOPER
diff --git a/kon/konprogram.h b/kon/konprogram.h
index 04aef18..a9390df 100644
--- a/kon/konprogram.h
+++ b/kon/konprogram.h
@@ -70,6 +70,7 @@ struct kon_program {
kon_assets_t *assets;
kon_font_t *font;
kon_debug_t *debug;
+ int maxFps; /* the frame cap in use, change it any time. -1 for none */
double time; /* seconds since the loop started */
};