//! Keep track of the time we spent in each part of the game loop. use std::time::Instant; /// Utility struct. /// Keeps track of the time we spent in each part of the game loop. #[derive(Debug)] pub struct Timing { /// The time we spent processing the whole frame pub frame: f32, frame_timer: Instant, /// The time we spent simulating game state pub galaxy: f32, galaxy_timer: Instant, /// The time we spent simulating physics pub physics_sim: f32, physics_sim_timer: Instant, /// The time we spent updating physics ships pub physics_ship: f32, physics_ship_timer: Instant, /// The time we spent simulating physics pub render: f32, render_timer: Instant, } // TODO: macros // TODO: document each duration impl Timing { /// Create a new timing struct pub fn new() -> Self { Self { frame: f32::NAN, galaxy: f32::NAN, physics_sim: f32::NAN, physics_ship: f32::NAN, render: f32::NAN, galaxy_timer: Instant::now(), physics_sim_timer: Instant::now(), physics_ship_timer: Instant::now(), render_timer: Instant::now(), frame_timer: Instant::now(), } } /// Start frame timer pub fn start_frame(&mut self) { self.frame_timer = Instant::now(); } /// Start galaxy timer pub fn start_galaxy(&mut self) { self.galaxy_timer = Instant::now(); } /// Start physics sim timer pub fn start_physics_sim(&mut self) { self.physics_sim_timer = Instant::now(); } /// Start physics ship timer pub fn start_physics_ships(&mut self) { self.physics_ship_timer = Instant::now(); } /// Start render timer pub fn start_render(&mut self) { self.render_timer = Instant::now(); } /// Record galaxy simulation time. pub fn mark_frame(&mut self) { self.frame = self.frame_timer.elapsed().as_secs_f32(); } /// Record galaxy simulation time. pub fn mark_galaxy(&mut self) { self.galaxy = self.galaxy_timer.elapsed().as_secs_f32(); } /// Record physics simulation time pub fn mark_physics_sim(&mut self) { self.physics_sim = self.physics_sim_timer.elapsed().as_secs_f32(); } /// Record physics ship update time pub fn mark_physics_ships(&mut self) { self.physics_ship = self.physics_ship_timer.elapsed().as_secs_f32(); } /// Record physics simulation time pub fn mark_render(&mut self) { self.render = self.render_timer.elapsed().as_secs_f32(); } }