Skip to content

Commit c64e53d

Browse files
authored
Implement get_fps and get_delta_time
* implement get fps * fix wasm * add doc get fps * rename from get_rate to get_delta_time
1 parent d7e71a0 commit c64e53d

File tree

8 files changed

+74
-11
lines changed

8 files changed

+74
-11
lines changed

src/lib.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,24 @@ impl Window {
631631
}
632632
}
633633

634+
/// Returns the current fps of the window
635+
///
636+
/// # Examples
637+
///
638+
/// ```no_run
639+
/// # use minifb::*;
640+
/// # let mut window = Window::new("Test", 640, 400, WindowOptions::default()).unwrap();
641+
/// let fps = window.get_fps();
642+
/// println!("fps {}", fps);
643+
/// ```
644+
#[inline]
645+
pub fn get_fps(&mut self) -> usize {
646+
match self.0.get_delta_time() {
647+
Some(rate) => (1.0 / rate.as_secs_f32()) as usize,
648+
_ => 0,
649+
}
650+
}
651+
634652
/// Returns the current size of the window
635653
///
636654
/// # Examples

src/os/macos/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,11 @@ impl Window {
344344
self.update_rate.set_rate(rate);
345345
}
346346

347+
#[inline]
348+
pub fn get_delta_time(&self) -> Option<Duration> {
349+
self.update_rate.get_delta_time()
350+
}
351+
347352
#[inline]
348353
pub fn update_rate(&mut self) {
349354
self.update_rate.update();

src/os/posix/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,15 @@ impl Window {
225225
}
226226
}
227227

228+
pub fn get_delta_time(&self) -> Option<Duration> {
229+
match self {
230+
#[cfg(feature = "x11")]
231+
Window::X11(w) => w.get_delta_time(),
232+
#[cfg(feature = "wayland")]
233+
Window::Wayland(w) => w.get_delta_time(),
234+
}
235+
}
236+
228237
pub fn update_rate(&mut self) {
229238
match self {
230239
#[cfg(feature = "x11")]

src/os/posix/wayland.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,11 @@ impl Window {
672672
self.update_rate.set_rate(rate);
673673
}
674674

675+
#[inline]
676+
pub fn get_delta_time(&self) -> Option<Duration> {
677+
self.update_rate.get_delta_time()
678+
}
679+
675680
#[inline]
676681
pub fn set_key_repeat_rate(&mut self, rate: f32) {
677682
self.key_handler.set_key_repeat_delay(rate);

src/os/posix/x11.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,11 @@ impl Window {
769769
self.update_rate.set_rate(rate);
770770
}
771771

772+
#[inline]
773+
pub fn get_delta_time(&self) -> Option<Duration> {
774+
self.update_rate.get_delta_time()
775+
}
776+
772777
#[inline]
773778
pub fn update_rate(&mut self) {
774779
self.update_rate.update();

src/os/wasm/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,11 @@ impl Window {
228228
#[inline]
229229
pub fn set_rate(&mut self, _rate: Option<Duration>) {}
230230

231+
#[inline]
232+
pub fn get_delta_time(&self) -> Option<Duration> {
233+
None
234+
}
235+
231236
#[inline]
232237
pub fn update_rate(&mut self) {}
233238

src/os/windows/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,11 @@ impl Window {
870870
self.update_rate.set_rate(rate);
871871
}
872872

873+
#[inline]
874+
pub fn get_delta_time(&self) -> Option<Duration> {
875+
self.update_rate.get_delta_time()
876+
}
877+
873878
#[inline]
874879
pub fn update_rate(&mut self) {
875880
self.update_rate.update();

src/rate.rs

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,45 @@ use std::time::{Duration, Instant};
99
pub struct UpdateRate {
1010
target_rate: Option<Duration>,
1111
prev_time: Instant,
12+
delta: Option<Duration>,
1213
}
1314

1415
#[cfg_attr(target_arch = "wasm32", allow(unused))]
1516
impl UpdateRate {
16-
pub fn new() -> UpdateRate {
17-
UpdateRate {
18-
// Default limit to 4 ms
17+
pub fn new() -> Self {
18+
Self {
19+
// Default target rate: 4 ms per frame (~250 FPS)
1920
target_rate: Some(Duration::from_millis(4)),
2021
prev_time: Instant::now(),
22+
delta: None,
2123
}
2224
}
2325

2426
#[inline]
2527
pub fn set_rate(&mut self, rate: Option<Duration>) {
26-
self.target_rate = rate
28+
self.target_rate = rate;
2729
}
2830

2931
pub fn update(&mut self) {
30-
if let Some(target_rate) = self.target_rate {
31-
let delta = self.prev_time.elapsed();
32+
let now = Instant::now();
33+
let elapsed = now.duration_since(self.prev_time);
3234

33-
if delta < target_rate {
34-
let sleep_time = target_rate - delta;
35-
//eprintln!("sleeping {} ms", sleep_time.as_secs_f64() * 1000.);
35+
// If a target rate is set, sleep to match it
36+
if let Some(target_rate) = self.target_rate {
37+
if elapsed < target_rate {
38+
let sleep_time = target_rate - elapsed;
3639
std::thread::sleep(sleep_time);
3740
}
38-
39-
self.prev_time = Instant::now();
4041
}
42+
43+
// Now mark the new frame time and compute total delta (including sleep)
44+
let now = Instant::now();
45+
self.delta = Some(now.duration_since(self.prev_time));
46+
self.prev_time = now;
47+
}
48+
49+
#[inline]
50+
pub fn get_delta_time(&self) -> Option<Duration> {
51+
self.delta
4152
}
4253
}

0 commit comments

Comments
 (0)