From 129b5339e1d6fb7f95457bc19eeded8761c5c143 Mon Sep 17 00:00:00 2001 From: anth64 Date: Mon, 24 Aug 2026 17:20:11 +0200 Subject: [PATCH] feat: split frame/tick diagnostics into work/total/budget --- include/clock.h | 5 +++-- include/fps.h | 4 +++- src/fps.c | 18 +++++++++++++++--- src/platform/client/video/gl.c | 1 + src/platform/client/video/sdl.c | 1 + src/skele.c | 16 ++++++++++------ 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/include/clock.h b/include/clock.h index b458664..af0aca0 100644 --- a/include/clock.h +++ b/include/clock.h @@ -8,8 +8,9 @@ extern "C" { #endif extern float skele_tps; -extern uint64_t skele_tick_time_ns; -extern uint64_t skele_tick_idle_ns; +extern uint64_t skele_tick_work_time_ns; +extern uint64_t skele_tick_idle_time_ns; +extern uint64_t skele_tick_total_time_ns; void skele_clock_init(void (*on_signal)(void)); uint64_t skele_time_ns(void); diff --git a/include/fps.h b/include/fps.h index b110b14..6952bd0 100644 --- a/include/fps.h +++ b/include/fps.h @@ -8,10 +8,12 @@ extern "C" { #endif extern float skele_fps; -extern float skele_frame_time_ms; +extern float skele_frame_work_time_ms; +extern float skele_frame_render_time_ms; extern float skele_frame_budget_ms; void skele_fps_init(void); +void skele_fps_work_mark(void); void skele_fps_frame_mark(void); #ifdef __cplusplus diff --git a/src/fps.c b/src/fps.c index 5cdf39a..50f5856 100644 --- a/src/fps.c +++ b/src/fps.c @@ -2,12 +2,14 @@ #include "clock.h" float skele_fps = 0.0f; -float skele_frame_time_ms = 0.0f; +float skele_frame_render_time_ms = 0.0f; float skele_frame_budget_ms = 0.0f; +float skele_frame_work_time_ms = 0.0f; static uint64_t win_start = 0; static uint64_t last_frame_ns = 0; static uint64_t frame_ns_accum = 0; +static uint64_t work_ns_accum = 0; static uint32_t frame_count = 0; void skele_fps_init(void) @@ -15,9 +17,16 @@ void skele_fps_init(void) win_start = skele_time_ns(); last_frame_ns = win_start; frame_ns_accum = 0; + work_ns_accum = 0; frame_count = 0; skele_fps = 0.0f; - skele_frame_time_ms = 0.0f; + skele_frame_render_time_ms = 0.0f; + skele_frame_work_time_ms = 0.0f; +} + +void skele_fps_work_mark(void) +{ + work_ns_accum += skele_time_ns() - last_frame_ns; } void skele_fps_frame_mark(void) @@ -31,11 +40,14 @@ void skele_fps_frame_mark(void) if (now - win_start >= 1000000000ULL) { double elapsed_s = (double)(now - win_start) / 1e9; skele_fps = (float)(frame_count / elapsed_s); - skele_frame_time_ms = + skele_frame_render_time_ms = (float)((frame_ns_accum / (double)frame_count) / 1e6); + skele_frame_work_time_ms = + (float)((work_ns_accum / (double)frame_count) / 1e6); win_start = now; frame_ns_accum = 0; + work_ns_accum = 0; frame_count = 0; } } diff --git a/src/platform/client/video/gl.c b/src/platform/client/video/gl.c index d8ad7bc..382c483 100644 --- a/src/platform/client/video/gl.c +++ b/src/platform/client/video/gl.c @@ -244,6 +244,7 @@ void skele_video_shutdown(void) void skele_video_present(void) { + skele_fps_work_mark(); present_fn(); skele_fps_frame_mark(); } diff --git a/src/platform/client/video/sdl.c b/src/platform/client/video/sdl.c index eb701c1..b1cd39e 100644 --- a/src/platform/client/video/sdl.c +++ b/src/platform/client/video/sdl.c @@ -289,6 +289,7 @@ void skele_video_blit(uint8_t *pixels) void skele_video_present(void) { + skele_fps_work_mark(); present_fn(); skele_fps_frame_mark(); } diff --git a/src/skele.c b/src/skele.c index 68aeac0..be1b746 100644 --- a/src/skele.c +++ b/src/skele.c @@ -6,8 +6,9 @@ uint64_t skele_tick_ns = 1000000000ULL / SKELE_DEFAULT_TICK_RATE; float skele_tps = 0.0f; -uint64_t skele_tick_time_ns = 0; -uint64_t skele_tick_idle_ns = 0; +uint64_t skele_tick_work_time_ns = 0; +uint64_t skele_tick_idle_time_ns = 0; +uint64_t skele_tick_total_time_ns = 0; static uint8_t stk_initialized = 0; @@ -30,8 +31,9 @@ uint8_t skele_init(void) tick_idle_accum = 0; tick_count = 0; skele_tps = 0.0f; - skele_tick_time_ns = 0; - skele_tick_idle_ns = 0; + skele_tick_work_time_ns = 0; + skele_tick_idle_time_ns = 0; + skele_tick_total_time_ns = 0; return SKELE_INIT_SUCCESS; } @@ -55,8 +57,10 @@ void skele_clock_tick_end(void) if (now - tick_win_start >= 1000000000ULL) { double elapsed_s = (now - tick_win_start) / 1e9; skele_tps = tick_count / elapsed_s; - skele_tick_time_ns = tick_ns_accum / tick_count; - skele_tick_idle_ns = tick_idle_accum / tick_count; + skele_tick_work_time_ns = tick_ns_accum / tick_count; + skele_tick_idle_time_ns = tick_idle_accum / tick_count; + skele_tick_total_time_ns = + skele_tick_work_time_ns + skele_tick_idle_time_ns; tick_win_start = now; tick_ns_accum = 0;