diff --git a/src/client/misc.zig b/src/client/misc.zig new file mode 100644 index 0000000..c4f78f3 --- /dev/null +++ b/src/client/misc.zig @@ -0,0 +1,49 @@ +const rl = @import("raylib"); + +const FPS_CAPTURE_FRAMES_COUNT : i32 = 30; // 30 captures +const FPS_AVERAGE_TIME_SECONDS : f32 = 0.5; // 500 milliseconds +const FPS_STEP : f32 = (FPS_AVERAGE_TIME_SECONDS / FPS_CAPTURE_FRAMES_COUNT); + +var index : u32 = 0; +var history : [FPS_CAPTURE_FRAMES_COUNT]f32 = .{0} ** FPS_CAPTURE_FRAMES_COUNT; +var average : f32 = 0; +var last : f32 = 0; + +pub fn drawFPS(posX : i32, posY : i32, fpsFrame : f32, frame : i32) void { + var color : rl.Color = .lime; // Good FPS + const fps : i32 = getFPS(fpsFrame, frame); + + if ((fps < 30) and (fps >= 15)) {color = .orange;} // Warning FPS + else if (fps < 15) color = .red; // Low FPS + + rl.drawText(rl.textFormat("%2i FPS", .{fps}), posX, posY, 20, color); +} + +pub fn getFPS(fpsFrame : f32, frame : i32) i32 { + var fps : i32 = 0; + + // if we reset the window, reset the FPS info + if (frame == 0) + { + average = 0; + last = 0; + index = 0; + + for (0..FPS_CAPTURE_FRAMES_COUNT) |i| history[i] = 0; + } + + if (fpsFrame == 0) return 0; + + if ((rl.getTime() - last) > FPS_STEP) + { + last = @floatCast(rl.getTime()); + index = (index + 1) % FPS_CAPTURE_FRAMES_COUNT; + average -= history[index]; + history[index] = fpsFrame / FPS_CAPTURE_FRAMES_COUNT; + average += history[index]; + } + + fps = @intFromFloat(@round(1.0 / average)); + + return fps; +}