summaryrefslogtreecommitdiff
path: root/engine/src/performance.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/performance.rs')
-rw-r--r--engine/src/performance.rs59
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>,
+}