45 lines
1.5 KiB
Rust
45 lines
1.5 KiB
Rust
|
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<Self, Box<dyn std::error::Error>> {
|
||
|
Ok(Framerate {
|
||
|
start: Instant::now(),
|
||
|
prev_trace_time: Instant::now(),
|
||
|
framerate,
|
||
|
})
|
||
|
}
|
||
|
pub fn handle_time(&mut self) -> Result<(f64), Box<dyn std::error::Error>> {
|
||
|
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)
|
||
|
}
|
||
|
}
|