From 182bcfba5e2538596e2d8a62f78facce13457e68 Mon Sep 17 00:00:00 2001 From: Luca Casati Date: Wed, 5 Nov 2025 23:57:24 +0100 Subject: [PATCH 1/4] implement get fps --- src/lib.rs | 8 ++++++++ src/os/macos/mod.rs | 5 +++++ src/os/posix/mod.rs | 9 +++++++++ src/os/posix/wayland.rs | 5 +++++ src/os/posix/x11.rs | 5 +++++ src/os/wasm/mod.rs | 3 +++ src/os/windows/mod.rs | 5 +++++ src/rate.rs | 33 ++++++++++++++++++++++----------- 8 files changed, 62 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 30e3216..93e1a8f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -631,6 +631,14 @@ impl Window { } } + #[inline] + pub fn get_fps(&mut self) -> usize { + match self.0.get_rate() { + Some(rate) => (1.0 / rate.as_secs_f32()) as usize, + _ => 0, + } + } + /// Returns the current size of the window /// /// # Examples diff --git a/src/os/macos/mod.rs b/src/os/macos/mod.rs index 84a8b49..8a8424c 100644 --- a/src/os/macos/mod.rs +++ b/src/os/macos/mod.rs @@ -344,6 +344,11 @@ impl Window { self.update_rate.set_rate(rate); } + #[inline] + pub fn get_rate(&self) -> Option { + self.update_rate.get_rate() + } + #[inline] pub fn update_rate(&mut self) { self.update_rate.update(); diff --git a/src/os/posix/mod.rs b/src/os/posix/mod.rs index 716b71b..3733c53 100644 --- a/src/os/posix/mod.rs +++ b/src/os/posix/mod.rs @@ -225,6 +225,15 @@ impl Window { } } + pub fn get_rate(&self) -> Option { + match self { + #[cfg(feature = "x11")] + Window::X11(w) => w.get_rate(), + #[cfg(feature = "wayland")] + Window::Wayland(w) => w.get_rate(), + } + } + pub fn update_rate(&mut self) { match self { #[cfg(feature = "x11")] diff --git a/src/os/posix/wayland.rs b/src/os/posix/wayland.rs index 51ef6c3..28fada9 100644 --- a/src/os/posix/wayland.rs +++ b/src/os/posix/wayland.rs @@ -672,6 +672,11 @@ impl Window { self.update_rate.set_rate(rate); } + #[inline] + pub fn get_rate(&self) -> Option { + self.update_rate.get_rate() + } + #[inline] pub fn set_key_repeat_rate(&mut self, rate: f32) { self.key_handler.set_key_repeat_delay(rate); diff --git a/src/os/posix/x11.rs b/src/os/posix/x11.rs index bcbb386..052d9ef 100644 --- a/src/os/posix/x11.rs +++ b/src/os/posix/x11.rs @@ -769,6 +769,11 @@ impl Window { self.update_rate.set_rate(rate); } + #[inline] + pub fn get_rate(&self) -> Option { + self.update_rate.get_rate() + } + #[inline] pub fn update_rate(&mut self) { self.update_rate.update(); diff --git a/src/os/wasm/mod.rs b/src/os/wasm/mod.rs index 8a81cb1..401ee8a 100644 --- a/src/os/wasm/mod.rs +++ b/src/os/wasm/mod.rs @@ -228,6 +228,9 @@ impl Window { #[inline] pub fn set_rate(&mut self, _rate: Option) {} + #[inline] + pub fn get_rate(&self) -> Option {} + #[inline] pub fn update_rate(&mut self) {} diff --git a/src/os/windows/mod.rs b/src/os/windows/mod.rs index 304cd2e..ebbae32 100644 --- a/src/os/windows/mod.rs +++ b/src/os/windows/mod.rs @@ -870,6 +870,11 @@ impl Window { self.update_rate.set_rate(rate); } + #[inline] + pub fn get_rate(&self) -> Option { + self.update_rate.get_rate() + } + #[inline] pub fn update_rate(&mut self) { self.update_rate.update(); diff --git a/src/rate.rs b/src/rate.rs index 39ef936..95f6205 100644 --- a/src/rate.rs +++ b/src/rate.rs @@ -9,34 +9,45 @@ use std::time::{Duration, Instant}; pub struct UpdateRate { target_rate: Option, prev_time: Instant, + delta: Option, } #[cfg_attr(target_arch = "wasm32", allow(unused))] impl UpdateRate { - pub fn new() -> UpdateRate { - UpdateRate { - // Default limit to 4 ms + pub fn new() -> Self { + Self { + // Default target rate: 4 ms per frame (~250 FPS) target_rate: Some(Duration::from_millis(4)), prev_time: Instant::now(), + delta: None, } } #[inline] pub fn set_rate(&mut self, rate: Option) { - self.target_rate = rate + self.target_rate = rate; } pub fn update(&mut self) { - if let Some(target_rate) = self.target_rate { - let delta = self.prev_time.elapsed(); + let now = Instant::now(); + let elapsed = now.duration_since(self.prev_time); - if delta < target_rate { - let sleep_time = target_rate - delta; - //eprintln!("sleeping {} ms", sleep_time.as_secs_f64() * 1000.); + // If a target rate is set, sleep to match it + if let Some(target_rate) = self.target_rate { + if elapsed < target_rate { + let sleep_time = target_rate - elapsed; std::thread::sleep(sleep_time); } - - self.prev_time = Instant::now(); } + + // Now mark the new frame time and compute total delta (including sleep) + let now = Instant::now(); + self.delta = Some(now.duration_since(self.prev_time)); + self.prev_time = now; + } + + #[inline] + pub fn get_rate(&self) -> Option { + self.delta } } From 7363a5fa315385446d847681ddb2a86b471c17ad Mon Sep 17 00:00:00 2001 From: Luca Casati Date: Thu, 6 Nov 2025 00:08:30 +0100 Subject: [PATCH 2/4] fix wasm --- src/os/wasm/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/os/wasm/mod.rs b/src/os/wasm/mod.rs index 401ee8a..3d36ea8 100644 --- a/src/os/wasm/mod.rs +++ b/src/os/wasm/mod.rs @@ -229,7 +229,9 @@ impl Window { pub fn set_rate(&mut self, _rate: Option) {} #[inline] - pub fn get_rate(&self) -> Option {} + pub fn get_rate(&self) -> Option { + None + } #[inline] pub fn update_rate(&mut self) {} From f9b028e018ee3832bfdb656d449d52446e297a6e Mon Sep 17 00:00:00 2001 From: Luca Casati Date: Thu, 6 Nov 2025 18:55:55 +0100 Subject: [PATCH 3/4] add doc get fps --- src/lib.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 93e1a8f..e06f5df 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -631,6 +631,16 @@ impl Window { } } + /// Returns the current fps of the window + /// + /// # Examples + /// + /// ```no_run + /// # use minifb::*; + /// # let mut window = Window::new("Test", 640, 400, WindowOptions::default()).unwrap(); + /// let fps = window.get_fps(); + /// println!("fps {}", fps); + /// ``` #[inline] pub fn get_fps(&mut self) -> usize { match self.0.get_rate() { From 96ceda87b592834b519f310a05ef59c1f76d925a Mon Sep 17 00:00:00 2001 From: Luca Casati Date: Fri, 7 Nov 2025 23:10:09 +0100 Subject: [PATCH 4/4] rename from get_rate to get_delta_time --- src/lib.rs | 2 +- src/os/macos/mod.rs | 4 ++-- src/os/posix/mod.rs | 6 +++--- src/os/posix/wayland.rs | 4 ++-- src/os/posix/x11.rs | 4 ++-- src/os/wasm/mod.rs | 2 +- src/os/windows/mod.rs | 4 ++-- src/rate.rs | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index e06f5df..f0feb08 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -643,7 +643,7 @@ impl Window { /// ``` #[inline] pub fn get_fps(&mut self) -> usize { - match self.0.get_rate() { + match self.0.get_delta_time() { Some(rate) => (1.0 / rate.as_secs_f32()) as usize, _ => 0, } diff --git a/src/os/macos/mod.rs b/src/os/macos/mod.rs index 8a8424c..cf488d0 100644 --- a/src/os/macos/mod.rs +++ b/src/os/macos/mod.rs @@ -345,8 +345,8 @@ impl Window { } #[inline] - pub fn get_rate(&self) -> Option { - self.update_rate.get_rate() + pub fn get_delta_time(&self) -> Option { + self.update_rate.get_delta_time() } #[inline] diff --git a/src/os/posix/mod.rs b/src/os/posix/mod.rs index 3733c53..6ce36ce 100644 --- a/src/os/posix/mod.rs +++ b/src/os/posix/mod.rs @@ -225,12 +225,12 @@ impl Window { } } - pub fn get_rate(&self) -> Option { + pub fn get_delta_time(&self) -> Option { match self { #[cfg(feature = "x11")] - Window::X11(w) => w.get_rate(), + Window::X11(w) => w.get_delta_time(), #[cfg(feature = "wayland")] - Window::Wayland(w) => w.get_rate(), + Window::Wayland(w) => w.get_delta_time(), } } diff --git a/src/os/posix/wayland.rs b/src/os/posix/wayland.rs index 28fada9..6722330 100644 --- a/src/os/posix/wayland.rs +++ b/src/os/posix/wayland.rs @@ -673,8 +673,8 @@ impl Window { } #[inline] - pub fn get_rate(&self) -> Option { - self.update_rate.get_rate() + pub fn get_delta_time(&self) -> Option { + self.update_rate.get_delta_time() } #[inline] diff --git a/src/os/posix/x11.rs b/src/os/posix/x11.rs index 052d9ef..f744409 100644 --- a/src/os/posix/x11.rs +++ b/src/os/posix/x11.rs @@ -770,8 +770,8 @@ impl Window { } #[inline] - pub fn get_rate(&self) -> Option { - self.update_rate.get_rate() + pub fn get_delta_time(&self) -> Option { + self.update_rate.get_delta_time() } #[inline] diff --git a/src/os/wasm/mod.rs b/src/os/wasm/mod.rs index 3d36ea8..a2d2879 100644 --- a/src/os/wasm/mod.rs +++ b/src/os/wasm/mod.rs @@ -229,7 +229,7 @@ impl Window { pub fn set_rate(&mut self, _rate: Option) {} #[inline] - pub fn get_rate(&self) -> Option { + pub fn get_delta_time(&self) -> Option { None } diff --git a/src/os/windows/mod.rs b/src/os/windows/mod.rs index ebbae32..86932bb 100644 --- a/src/os/windows/mod.rs +++ b/src/os/windows/mod.rs @@ -871,8 +871,8 @@ impl Window { } #[inline] - pub fn get_rate(&self) -> Option { - self.update_rate.get_rate() + pub fn get_delta_time(&self) -> Option { + self.update_rate.get_delta_time() } #[inline] diff --git a/src/rate.rs b/src/rate.rs index 95f6205..f44a49b 100644 --- a/src/rate.rs +++ b/src/rate.rs @@ -47,7 +47,7 @@ impl UpdateRate { } #[inline] - pub fn get_rate(&self) -> Option { + pub fn get_delta_time(&self) -> Option { self.delta } }