summaryrefslogtreecommitdiff
path: root/src/daw.c
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2026-02-19 01:36:00 +0000
committeronelin <oscar@nelin.dk>2026-02-19 01:37:39 +0000
commitc582841c01aeb30ec5cf7451d34ee45f8e228aa7 (patch)
treeaebd893b918c0b4c39040bc3b49aed1dd9b45f2c /src/daw.c
parent375d9081c6ec540ca10189378b8d24cfb7e63357 (diff)
Refine performance measurement
Diffstat (limited to 'src/daw.c')
-rw-r--r--src/daw.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/daw.c b/src/daw.c
index c6553ab..2e4238a 100644
--- a/src/daw.c
+++ b/src/daw.c
@@ -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;