diff options
Diffstat (limited to 'engine/src/performance.rs')
-rw-r--r-- | engine/src/performance.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/engine/src/performance.rs b/engine/src/performance.rs new file mode 100644 index 0000000..ffc5c27 --- /dev/null +++ b/engine/src/performance.rs @@ -0,0 +1,59 @@ +use std::time::Instant; + +use ecs::component::local::Local; +use ecs::system::{Into, System}; +use ecs::Component; + +use crate::event::PostPresent as PostPresentEvent; + +#[derive(Debug, Default)] +#[non_exhaustive] +pub struct Extension {} + +impl ecs::extension::Extension for Extension +{ + fn collect(self, mut collector: ecs::extension::Collector<'_>) + { + collector.add_system( + PostPresentEvent, + log_perf.into_system().initialize((State::default(),)), + ); + } +} + +#[cfg(feature = "debug")] +macro_rules! log_perf { + ($($tt: tt)*) => { + tracing::info!($($tt)*); + }; +} + +#[cfg(not(feature = "debug"))] +macro_rules! log_perf { + ($($tt: tt)*) => { + println!($($tt)*); + }; +} + +fn log_perf(mut state: Local<State>) +{ + let Some(last_time) = state.last_time else { + state.last_time = Some(Instant::now()); + return; + }; + + let time_now = Instant::now(); + + state.last_time = Some(time_now); + + log_perf!( + "Frame time: {}us", + time_now.duration_since(last_time).as_micros() + ); +} + +#[derive(Debug, Default, Component)] +struct State +{ + last_time: Option<Instant>, +} |