frame_stats.h

cross platform rendering playground

src/core/frame_stats.h

978 B
#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;
    }
};