diff options
| author | onelin <oscar@nelin.dk> | 2026-02-19 01:36:00 +0000 |
|---|---|---|
| committer | onelin <oscar@nelin.dk> | 2026-02-19 01:37:39 +0000 |
| commit | c582841c01aeb30ec5cf7451d34ee45f8e228aa7 (patch) | |
| tree | aebd893b918c0b4c39040bc3b49aed1dd9b45f2c /src | |
| parent | 375d9081c6ec540ca10189378b8d24cfb7e63357 (diff) | |
Refine performance measurement
Diffstat (limited to 'src')
| -rw-r--r-- | src/daw.c | 34 |
1 files changed, 30 insertions, 4 deletions
@@ -195,6 +195,14 @@ i32 engine_run(Instance* p, StateType initial_state, void* state_arg) { /* The target frametime measured in μs */ const u32 fps_cap = p->fps_target > 0 ? 1000000 / p->fps_target : 0; + u64 measurement_total[10]; + u64 measurement_rendering[10]; + u64 measurement_idle[10]; + + memset(measurement_total, 0, sizeof(u64) * 10); + memset(measurement_rendering, 0, sizeof(u64) * 10); + memset(measurement_idle, 0, sizeof(u64) * 10); + /* Main loop */ do { /* frame_start is μs since engine was initialized */ @@ -202,6 +210,7 @@ i32 engine_run(Instance* p, StateType initial_state, void* state_arg) { /* dt measured in μs */ const u64 dt = frame_start - frame_end; + measurement_total[ticks%10] = dt; /* Delta is relative to FPS cap */ //const f64 delta = (f64)dt / (f64)fps_cap; @@ -245,14 +254,16 @@ i32 engine_run(Instance* p, StateType initial_state, void* state_arg) { const u64 rendertime_begin = get_time(); render_begin(p->window); render_present(p->window, &default_quad_renderobject); - const u64 rendertime_dt = get_time() - rendertime_begin; + measurement_rendering[ticks%10] = get_time() - rendertime_begin; /* Regulate FPS */ frame_end = get_time(); const i64 fps_diff = fps_cap - (i64)(frame_end - frame_start); if (fps_diff > 0) { + const u64 idletime_begin = get_time(); delay((u64)fps_diff); + measurement_idle[ticks%10] = get_time() - idletime_begin; } frame_end = frame_start; @@ -263,15 +274,30 @@ i32 engine_run(Instance* p, StateType initial_state, void* state_arg) { /* only make measurements once a second */ if (dt_measurement > 1000000) { + double avg_total = 0; + double avg_rendering = 0; + double avg_idle = 0; + + for (int i = 0; i < 10; i++) { + avg_total += measurement_total[i]; + avg_rendering += measurement_rendering[i]; + avg_idle += measurement_idle[i]; + } + avg_total /= 10.0; + avg_rendering /= 10.0; + avg_idle /= 10.0; + printf(" FPS: %.1f" "\tticks: %lu" - "\tframetime: %.3fms" + "\tdt: %.3fms" "\trendertime: %.3fms" + "\tidle: %.3fms" "\n" , ((f64)(ticks - last_fps_ticks)) / ((f64)dt_measurement / 1000000.0) , ticks - , (double)dt / 1000.0 - , (double)rendertime_dt / 1000.0 + , (double)avg_total / 1000.0 + , (double)avg_rendering / 1000.0 + , (double)avg_idle / 1000.0 ); last_fps_measurement = frame_end; |
