lj_qualibration/src/framerate.rs

48 lines
1.5 KiB
Rust

#[allow(unused)]
use log::{debug, warn};
use std::thread;
use std::time::{Duration, Instant};
/// Converts helios Geometry to Helios
#[allow(dead_code)]
#[derive(Debug, Clone, Copy)]
pub struct Framerate {
start: Instant,
prev_trace_time: Instant,
framerate: u8,
}
#[allow(dead_code)]
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)
}
}