@@ -9,34 +9,45 @@ use std::time::{Duration, Instant};
99pub 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) ) ]
1516impl 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