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(),)), ); } } 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); tracing::info!( "Frame time: {}us", time_now.duration_since(last_time).as_micros() ); } #[derive(Debug, Default, Component)] struct State { last_time: Option, }