use log::{debug, warn}; use std::thread; use std::time::{Duration, Instant}; /// Converts helios Geometry to Helios #[derive(Debug, Clone, Copy)] pub struct Framerate { start: Instant, prev_trace_time: Instant, framerate: u8, } impl Framerate { pub fn new(framerate: u8) -> Result> { Ok(Framerate { start: Instant::now(), prev_trace_time: Instant::now(), framerate, }) } pub fn handle_time(&mut self) -> Result<(f64), Box> { let frame_time = 1000000000 / self.framerate as u128; let now = Instant::now(); // How long since last loop ? let nanotime_spent = self.prev_trace_time.elapsed().as_nanos(); // Diw it go too fast? If so : sleep a bit if frame_time > nanotime_spent { let nanotime_towait = frame_time - nanotime_spent; let dur = Duration::new(0, (nanotime_towait as f32 * 0.9) as u32); //debug!( "{:?} - {:?} : {:?}", nanotime_towait, self.prev_trace_time, now); thread::sleep(dur); //debug!("Framerate OK"); } else { //warn!( // "Frame slower than expected {:?} > {:?}", // nanotime_spent, frame_time, //); } let time_from_begin = self.start.elapsed().as_nanos() as f64 / 1000000000.; self.prev_trace_time = now; Ok(time_from_begin) } }