diff --git a/crates/bevy_dev_tools/src/fps_overlay.rs b/crates/bevy_dev_tools/src/fps_overlay.rs index 23b21256cc..a6368cf92d 100644 --- a/crates/bevy_dev_tools/src/fps_overlay.rs +++ b/crates/bevy_dev_tools/src/fps_overlay.rs @@ -42,7 +42,7 @@ impl Plugin for FpsOverlayPlugin { fn build(&self, app: &mut bevy_app::App) { // TODO: Use plugin dependencies, see https://github.com/bevyengine/bevy/issues/69 if !app.is_plugin_added::() { - app.add_plugins(FrameTimeDiagnosticsPlugin); + app.add_plugins(FrameTimeDiagnosticsPlugin::default()); } app.insert_resource(self.config.clone()) .add_systems(Startup, setup) diff --git a/crates/bevy_diagnostic/src/frame_time_diagnostics_plugin.rs b/crates/bevy_diagnostic/src/frame_time_diagnostics_plugin.rs index 03cb08f853..f344d6c5c2 100644 --- a/crates/bevy_diagnostic/src/frame_time_diagnostics_plugin.rs +++ b/crates/bevy_diagnostic/src/frame_time_diagnostics_plugin.rs @@ -1,4 +1,7 @@ -use crate::{Diagnostic, DiagnosticPath, Diagnostics, FrameCount, RegisterDiagnostic}; +use crate::{ + Diagnostic, DiagnosticPath, Diagnostics, FrameCount, RegisterDiagnostic, + DEFAULT_MAX_HISTORY_LENGTH, +}; use bevy_app::prelude::*; use bevy_ecs::prelude::*; use bevy_time::{Real, Time}; @@ -8,15 +11,49 @@ use bevy_time::{Real, Time}; /// # See also /// /// [`LogDiagnosticsPlugin`](crate::LogDiagnosticsPlugin) to output diagnostics to the console. -#[derive(Default)] -pub struct FrameTimeDiagnosticsPlugin; +pub struct FrameTimeDiagnosticsPlugin { + /// The total number of values to keep for averaging. + pub max_history_length: usize, + /// The smoothing factor for the exponential moving average. Usually `(history_length + 1.0) / 2.0)`. + pub smoothing_factor: f64, +} +impl Default for FrameTimeDiagnosticsPlugin { + fn default() -> Self { + Self::new(DEFAULT_MAX_HISTORY_LENGTH) + } +} +impl FrameTimeDiagnosticsPlugin { + /// Creates a new `FrameTimeDiagnosticsPlugin` with the specified `max_history_length` and a + /// reasonable `smoothing_factor`. + pub fn new(max_history_length: usize) -> Self { + Self { + max_history_length, + smoothing_factor: (max_history_length as f64 + 1.0) / 2.0, + } + } +} impl Plugin for FrameTimeDiagnosticsPlugin { fn build(&self, app: &mut App) { - app.register_diagnostic(Diagnostic::new(Self::FRAME_TIME).with_suffix("ms")) - .register_diagnostic(Diagnostic::new(Self::FPS)) - .register_diagnostic(Diagnostic::new(Self::FRAME_COUNT).with_smoothing_factor(0.0)) - .add_systems(Update, Self::diagnostic_system); + app.register_diagnostic( + Diagnostic::new(Self::FRAME_TIME) + .with_suffix("ms") + .with_max_history_length(self.max_history_length) + .with_smoothing_factor(self.smoothing_factor), + ) + .register_diagnostic( + Diagnostic::new(Self::FPS) + .with_max_history_length(self.max_history_length) + .with_smoothing_factor(self.smoothing_factor), + ) + // An average frame count would be nonsensical, so we set the max history length + // to zero and disable smoothing. + .register_diagnostic( + Diagnostic::new(Self::FRAME_COUNT) + .with_smoothing_factor(0.0) + .with_max_history_length(0), + ) + .add_systems(Update, Self::diagnostic_system); } } diff --git a/examples/diagnostics/enabling_disabling_diagnostic.rs b/examples/diagnostics/enabling_disabling_diagnostic.rs index 27562bb98c..ca1bdbd5de 100644 --- a/examples/diagnostics/enabling_disabling_diagnostic.rs +++ b/examples/diagnostics/enabling_disabling_diagnostic.rs @@ -12,7 +12,7 @@ fn main() { App::new() .add_plugins(( DefaultPlugins, - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), )) .add_systems( diff --git a/examples/diagnostics/log_diagnostics.rs b/examples/diagnostics/log_diagnostics.rs index d0934c5e39..287258f7d3 100644 --- a/examples/diagnostics/log_diagnostics.rs +++ b/examples/diagnostics/log_diagnostics.rs @@ -10,7 +10,7 @@ fn main() { .add_plugins(( DefaultPlugins, // Adds frame time diagnostics - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), // Adds a system that prints diagnostics to the console LogDiagnosticsPlugin::default(), // Any plugin can register diagnostics. Uncomment this to add an entity count diagnostics: diff --git a/examples/stress_tests/bevymark.rs b/examples/stress_tests/bevymark.rs index 82ec088992..b91ec3ba18 100644 --- a/examples/stress_tests/bevymark.rs +++ b/examples/stress_tests/bevymark.rs @@ -142,7 +142,7 @@ fn main() { }), ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), )) .insert_resource(WinitSettings { diff --git a/examples/stress_tests/many_animated_sprites.rs b/examples/stress_tests/many_animated_sprites.rs index c2282a293f..3266735877 100644 --- a/examples/stress_tests/many_animated_sprites.rs +++ b/examples/stress_tests/many_animated_sprites.rs @@ -21,7 +21,7 @@ fn main() { // Since this is also used as a benchmark, we want it to display performance data. .add_plugins(( LogDiagnosticsPlugin::default(), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), DefaultPlugins.set(WindowPlugin { primary_window: Some(Window { present_mode: PresentMode::AutoNoVsync, diff --git a/examples/stress_tests/many_buttons.rs b/examples/stress_tests/many_buttons.rs index 6ecba9e480..314252c0b5 100644 --- a/examples/stress_tests/many_buttons.rs +++ b/examples/stress_tests/many_buttons.rs @@ -73,7 +73,7 @@ fn main() { }), ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), )) .insert_resource(WinitSettings { diff --git a/examples/stress_tests/many_components.rs b/examples/stress_tests/many_components.rs index 4bb87d322d..795116cced 100644 --- a/examples/stress_tests/many_components.rs +++ b/examples/stress_tests/many_components.rs @@ -146,7 +146,7 @@ fn stress_test(num_entities: u32, num_components: u32, num_systems: u32) { app.add_plugins(MinimalPlugins) .add_plugins(DiagnosticsPlugin) .add_plugins(LogPlugin::default()) - .add_plugins(FrameTimeDiagnosticsPlugin) + .add_plugins(FrameTimeDiagnosticsPlugin::default()) .add_plugins(LogDiagnosticsPlugin::filtered(vec![DiagnosticPath::new( "fps", )])); diff --git a/examples/stress_tests/many_cubes.rs b/examples/stress_tests/many_cubes.rs index fe8e8b4507..2b199a4a4b 100644 --- a/examples/stress_tests/many_cubes.rs +++ b/examples/stress_tests/many_cubes.rs @@ -111,7 +111,7 @@ fn main() { }), ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), )) .insert_resource(WinitSettings { diff --git a/examples/stress_tests/many_foxes.rs b/examples/stress_tests/many_foxes.rs index 4752afd6e1..c1284c9bd6 100644 --- a/examples/stress_tests/many_foxes.rs +++ b/examples/stress_tests/many_foxes.rs @@ -51,7 +51,7 @@ fn main() { }), ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), )) .insert_resource(WinitSettings { diff --git a/examples/stress_tests/many_gizmos.rs b/examples/stress_tests/many_gizmos.rs index c20773d052..b1ef579b24 100644 --- a/examples/stress_tests/many_gizmos.rs +++ b/examples/stress_tests/many_gizmos.rs @@ -23,7 +23,7 @@ fn main() { }), ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), )) .insert_resource(WinitSettings { diff --git a/examples/stress_tests/many_glyphs.rs b/examples/stress_tests/many_glyphs.rs index 35d1e795b0..fe29bc933e 100644 --- a/examples/stress_tests/many_glyphs.rs +++ b/examples/stress_tests/many_glyphs.rs @@ -48,7 +48,7 @@ fn main() { }), ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), )) .insert_resource(WinitSettings { diff --git a/examples/stress_tests/many_lights.rs b/examples/stress_tests/many_lights.rs index 696e63b930..a19f02d156 100644 --- a/examples/stress_tests/many_lights.rs +++ b/examples/stress_tests/many_lights.rs @@ -28,7 +28,7 @@ fn main() { }), ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), LogVisibleLights, )) diff --git a/examples/stress_tests/many_sprites.rs b/examples/stress_tests/many_sprites.rs index fd7f6f3cc0..0931822e91 100644 --- a/examples/stress_tests/many_sprites.rs +++ b/examples/stress_tests/many_sprites.rs @@ -32,7 +32,7 @@ fn main() { // Since this is also used as a benchmark, we want it to display performance data. .add_plugins(( LogDiagnosticsPlugin::default(), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), DefaultPlugins.set(WindowPlugin { primary_window: Some(Window { present_mode: PresentMode::AutoNoVsync, diff --git a/examples/stress_tests/many_text2d.rs b/examples/stress_tests/many_text2d.rs index 2185ae6793..2575a0d92d 100644 --- a/examples/stress_tests/many_text2d.rs +++ b/examples/stress_tests/many_text2d.rs @@ -66,7 +66,7 @@ fn main() { let mut app = App::new(); app.add_plugins(( - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), DefaultPlugins.set(WindowPlugin { primary_window: Some(Window { diff --git a/examples/stress_tests/text_pipeline.rs b/examples/stress_tests/text_pipeline.rs index 0c2af6c4a0..acb0b0e804 100644 --- a/examples/stress_tests/text_pipeline.rs +++ b/examples/stress_tests/text_pipeline.rs @@ -23,7 +23,7 @@ fn main() { }), ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), )) .insert_resource(WinitSettings { diff --git a/examples/stress_tests/transform_hierarchy.rs b/examples/stress_tests/transform_hierarchy.rs index 8a81c9430f..91ed3405fb 100644 --- a/examples/stress_tests/transform_hierarchy.rs +++ b/examples/stress_tests/transform_hierarchy.rs @@ -193,7 +193,7 @@ fn main() { exit_condition: ExitCondition::DontExit, ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), LogDiagnosticsPlugin::default(), )) .add_systems(Startup, setup) diff --git a/examples/ui/text.rs b/examples/ui/text.rs index 354a04a23d..e1bb85bc09 100644 --- a/examples/ui/text.rs +++ b/examples/ui/text.rs @@ -11,7 +11,7 @@ use bevy::{ fn main() { App::new() - .add_plugins((DefaultPlugins, FrameTimeDiagnosticsPlugin)) + .add_plugins((DefaultPlugins, FrameTimeDiagnosticsPlugin::default())) .add_systems(Startup, setup) .add_systems(Update, (text_update_system, text_color_system)) .run(); diff --git a/examples/ui/text_debug.rs b/examples/ui/text_debug.rs index 3c9e42b54d..b17b50a4e3 100644 --- a/examples/ui/text_debug.rs +++ b/examples/ui/text_debug.rs @@ -20,7 +20,7 @@ fn main() { }), ..default() }), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), )) .add_systems(Startup, infotext_system) .add_systems(Update, change_text_system) diff --git a/examples/window/window_settings.rs b/examples/window/window_settings.rs index 07efc26df9..ed44d6768c 100644 --- a/examples/window/window_settings.rs +++ b/examples/window/window_settings.rs @@ -37,7 +37,7 @@ fn main() { ..default() }), LogDiagnosticsPlugin::default(), - FrameTimeDiagnosticsPlugin, + FrameTimeDiagnosticsPlugin::default(), )) .add_systems(Startup, init_cursor_icons) .add_systems(