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) { 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, }