#pragma once
#include "globals.h"
struct FrameStats {
static constexpr u32 HISTORY_SIZE = 120;
// per-frame ms
f32 history[HISTORY_SIZE] = {};
u32 write = 0;
u32 frames = 0;
f32 last_ms = 0.0f;
f32 avg_ms = 0.0f;
f32 min_ms = 0.0f;
f32 max_ms = 0.0f;
void record(f32 ms) {
last_ms = ms;
history[write] = ms;
write = (write + 1) % HISTORY_SIZE;
frames++;
u32 n = (frames < HISTORY_SIZE) ? frames : HISTORY_SIZE;
f32 sum = 0.0f;
min_ms = ms;
max_ms = ms;
for (u32 i = 0; i < n; ++i) {
f32 v = history[(write + HISTORY_SIZE - n + i) % HISTORY_SIZE];
sum += v;
if (v < min_ms) {
min_ms = v;
}
if (v > max_ms) {
max_ms = v;
}
}
avg_ms = sum / (f32)n;
}
f32 fps() const {
return avg_ms > 0.0f ? 1000.0f / avg_ms : 0.0f;
}
};