|
|
@@ -36,7 +36,11 @@ struct State<'a> {
|
|
|
num_vertices: u32,
|
|
|
last_frame: Instant,
|
|
|
framecount: u64,
|
|
|
+
|
|
|
+
|
|
|
frametime: f64,
|
|
|
+ old_frame_times: Vec<f64>,
|
|
|
+ max_history_size: usize,
|
|
|
//sky_pipeline: wgpu::RenderPipeline,
|
|
|
}
|
|
|
|
|
|
@@ -170,11 +174,13 @@ impl<'a> State<'a> {
|
|
|
multiview: None
|
|
|
});
|
|
|
|
|
|
- let last_frame = Instant::now();
|
|
|
- let delta = 0.2;
|
|
|
+ let last_frame: Instant = Instant::now();
|
|
|
+ let delta: f64 = 0.2;
|
|
|
|
|
|
//let sky_pipeline = sky::sky_pipeline::new_sky_pipeline(&device, &config);
|
|
|
let framecount: u64 = 0;
|
|
|
+ let old_frame_times : Vec<f64> = vec![];
|
|
|
+ let max_history: usize = 60;
|
|
|
|
|
|
Self {
|
|
|
surface,
|
|
|
@@ -194,7 +200,9 @@ impl<'a> State<'a> {
|
|
|
last_frame: last_frame,
|
|
|
frametime: delta,
|
|
|
//sky_pipeline: sky_pipeline
|
|
|
- framecount
|
|
|
+ framecount,
|
|
|
+ old_frame_times: old_frame_times,
|
|
|
+ max_history_size: max_history
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -273,11 +281,18 @@ impl<'a> State<'a> {
|
|
|
self.queue.submit(iter::once(encoder.finish()));
|
|
|
output.present();
|
|
|
|
|
|
- self.frametime = self.last_frame.elapsed().as_micros() as f64;
|
|
|
+ self.frametime = (self.last_frame.elapsed().as_secs() as f64) + (self.last_frame.elapsed().as_nanos() as f64 / 1_000_000_000.0);
|
|
|
self.last_frame = Instant::now();
|
|
|
- self.framecount += 1;
|
|
|
- println!("{:?}", self.framecount);
|
|
|
- //println!("{:?}", self.frametime);
|
|
|
+
|
|
|
+
|
|
|
+ self.old_frame_times.push(self.frametime);
|
|
|
+ if self.old_frame_times.len() > self.max_history_size {
|
|
|
+ self.old_frame_times.remove(0);
|
|
|
+ }
|
|
|
+ let smoothed_frame_time = self.old_frame_times.iter().sum::<f64>() / self.old_frame_times.len() as f64;
|
|
|
+ let smoothed_fps = 1.0 / smoothed_frame_time;
|
|
|
+
|
|
|
+ println!("{:?}", smoothed_fps);
|
|
|
|
|
|
Ok(())
|
|
|
}
|