Print diagnostics plugin
This commit is contained in:
		
							parent
							
								
									ea16f6fc56
								
							
						
					
					
						commit
						704a742661
					
				@ -1,79 +0,0 @@
 | 
				
			|||||||
use super::{Diagnostic, DiagnosticId, Diagnostics};
 | 
					 | 
				
			||||||
use bevy_core::time::Time;
 | 
					 | 
				
			||||||
use legion::prelude::*;
 | 
					 | 
				
			||||||
use std::time::Duration;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub struct PrintDiagnosticsState {
 | 
					 | 
				
			||||||
    elapsed: f64,
 | 
					 | 
				
			||||||
    wait_seconds: f64,
 | 
					 | 
				
			||||||
    filter: Option<Vec<DiagnosticId>>,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl PrintDiagnosticsState {
 | 
					 | 
				
			||||||
    pub fn new(wait: Duration) -> Self {
 | 
					 | 
				
			||||||
        PrintDiagnosticsState {
 | 
					 | 
				
			||||||
            elapsed: 0.,
 | 
					 | 
				
			||||||
            wait_seconds: wait.as_secs_f64(),
 | 
					 | 
				
			||||||
            filter: None,
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pub fn new_filtered(wait: Duration, filter: Vec<DiagnosticId>) -> Self {
 | 
					 | 
				
			||||||
        PrintDiagnosticsState {
 | 
					 | 
				
			||||||
            elapsed: 0.,
 | 
					 | 
				
			||||||
            wait_seconds: wait.as_secs_f64(),
 | 
					 | 
				
			||||||
            filter: Some(filter),
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fn print_diagnostic(diagnostic: &Diagnostic) {
 | 
					 | 
				
			||||||
    if let Some(value) = diagnostic.value() {
 | 
					 | 
				
			||||||
        print!("{:<20}: {:<19.6}", diagnostic.name, value);
 | 
					 | 
				
			||||||
        if let Some(average) = diagnostic.average() {
 | 
					 | 
				
			||||||
            print!("  (avg {:.6})", average);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        println!("\n");
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn print_diagnostics_system(
 | 
					 | 
				
			||||||
    mut state: ResourceMut<PrintDiagnosticsState>,
 | 
					 | 
				
			||||||
    time: Resource<Time>,
 | 
					 | 
				
			||||||
    diagnostics: Resource<Diagnostics>,
 | 
					 | 
				
			||||||
) {
 | 
					 | 
				
			||||||
    state.elapsed += time.delta_seconds_f64;
 | 
					 | 
				
			||||||
    if state.elapsed >= state.wait_seconds {
 | 
					 | 
				
			||||||
        state.elapsed = 0.0;
 | 
					 | 
				
			||||||
        if let Some(ref filter) = state.filter {
 | 
					 | 
				
			||||||
            for diagnostic in filter.iter().map(|id| diagnostics.get(*id).unwrap()) {
 | 
					 | 
				
			||||||
                print_diagnostic(diagnostic);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            for diagnostic in diagnostics.iter() {
 | 
					 | 
				
			||||||
                print_diagnostic(diagnostic);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn print_diagnostics_debug_system(
 | 
					 | 
				
			||||||
    mut state: ResourceMut<PrintDiagnosticsState>,
 | 
					 | 
				
			||||||
    time: Resource<Time>,
 | 
					 | 
				
			||||||
    diagnostics: Resource<Diagnostics>,
 | 
					 | 
				
			||||||
) {
 | 
					 | 
				
			||||||
    state.elapsed += time.delta_seconds_f64;
 | 
					 | 
				
			||||||
    if state.elapsed >= state.wait_seconds {
 | 
					 | 
				
			||||||
        state.elapsed = 0.0;
 | 
					 | 
				
			||||||
        if let Some(ref filter) = state.filter {
 | 
					 | 
				
			||||||
            for diagnostic in filter.iter().map(|id| diagnostics.get(*id).unwrap()) {
 | 
					 | 
				
			||||||
                println!("{:#?}\n", diagnostic);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            for diagnostic in diagnostics.iter() {
 | 
					 | 
				
			||||||
                println!("{:#?}\n", diagnostic);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,40 +1,20 @@
 | 
				
			|||||||
mod diagnostic;
 | 
					mod diagnostic;
 | 
				
			||||||
pub mod diagnostics;
 | 
					mod print_diagnostics_plugin;
 | 
				
			||||||
mod frame_time_diagnostics_plugin;
 | 
					mod frame_time_diagnostics_plugin;
 | 
				
			||||||
pub use diagnostic::*;
 | 
					pub use diagnostic::*;
 | 
				
			||||||
 | 
					pub use diagnostic::*;
 | 
				
			||||||
pub use frame_time_diagnostics_plugin::FrameTimeDiagnosticsPlugin;
 | 
					pub use frame_time_diagnostics_plugin::FrameTimeDiagnosticsPlugin;
 | 
				
			||||||
 | 
					pub use print_diagnostics_plugin::PrintDiagnosticsPlugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use bevy_app::{AppBuilder, AppPlugin};
 | 
					use bevy_app::{AppBuilder, AppPlugin};
 | 
				
			||||||
use diagnostics::{print_diagnostics_system, PrintDiagnosticsState};
 | 
					 | 
				
			||||||
use legion::prelude::IntoSystem;
 | 
					 | 
				
			||||||
use std::time::Duration;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub struct PrintDiagnostics {
 | 
					pub struct PrintDiagnostics {}
 | 
				
			||||||
    pub wait_duration: Duration,
 | 
					 | 
				
			||||||
    pub filter: Option<Vec<DiagnosticId>>,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub struct DiagnosticsPlugin {
 | 
					#[derive(Default)]
 | 
				
			||||||
    pub print_diagnostics: Option<PrintDiagnostics>,
 | 
					pub struct DiagnosticsPlugin;
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl Default for DiagnosticsPlugin {
 | 
					 | 
				
			||||||
    fn default() -> Self {
 | 
					 | 
				
			||||||
        DiagnosticsPlugin {
 | 
					 | 
				
			||||||
            print_diagnostics: Some(PrintDiagnostics {
 | 
					 | 
				
			||||||
                wait_duration: Duration::from_secs_f64(1.0),
 | 
					 | 
				
			||||||
                filter: None,
 | 
					 | 
				
			||||||
            }),
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl AppPlugin for DiagnosticsPlugin {
 | 
					impl AppPlugin for DiagnosticsPlugin {
 | 
				
			||||||
    fn build(&self, app: &mut AppBuilder) {
 | 
					    fn build(&self, app: &mut AppBuilder) {
 | 
				
			||||||
        app.init_resource::<Diagnostics>();
 | 
					        app.init_resource::<Diagnostics>();
 | 
				
			||||||
        if let Some(ref print_diagnostics) = self.print_diagnostics {
 | 
					 | 
				
			||||||
            app.add_resource(PrintDiagnosticsState::new(print_diagnostics.wait_duration))
 | 
					 | 
				
			||||||
                .add_system(print_diagnostics_system.system());
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										110
									
								
								crates/bevy_diagnostic/src/print_diagnostics_plugin.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								crates/bevy_diagnostic/src/print_diagnostics_plugin.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,110 @@
 | 
				
			|||||||
 | 
					use super::{Diagnostic, DiagnosticId, Diagnostics};
 | 
				
			||||||
 | 
					use bevy_app::{stage, AppPlugin};
 | 
				
			||||||
 | 
					use bevy_core::time::Time;
 | 
				
			||||||
 | 
					use legion::prelude::*;
 | 
				
			||||||
 | 
					use std::time::Duration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub struct PrintDiagnosticsPlugin {
 | 
				
			||||||
 | 
					    pub debug: bool,
 | 
				
			||||||
 | 
					    pub wait_duration: Duration,
 | 
				
			||||||
 | 
					    pub filter: Option<Vec<DiagnosticId>>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub struct PrintDiagnosticsState {
 | 
				
			||||||
 | 
					    elapsed: f64,
 | 
				
			||||||
 | 
					    wait_seconds: f64,
 | 
				
			||||||
 | 
					    filter: Option<Vec<DiagnosticId>>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Default for PrintDiagnosticsPlugin {
 | 
				
			||||||
 | 
					    fn default() -> Self {
 | 
				
			||||||
 | 
					        PrintDiagnosticsPlugin {
 | 
				
			||||||
 | 
					            debug: false,
 | 
				
			||||||
 | 
					            wait_duration: Duration::from_secs(1),
 | 
				
			||||||
 | 
					            filter: None,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl AppPlugin for PrintDiagnosticsPlugin {
 | 
				
			||||||
 | 
					    fn build(&self, app: &mut bevy_app::AppBuilder) {
 | 
				
			||||||
 | 
					        app.add_resource(PrintDiagnosticsState {
 | 
				
			||||||
 | 
					            elapsed: 0.0,
 | 
				
			||||||
 | 
					            wait_seconds: self.wait_duration.as_secs_f64(),
 | 
				
			||||||
 | 
					            filter: self.filter.clone(),
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self.debug {
 | 
				
			||||||
 | 
					            app.add_system_to_stage(
 | 
				
			||||||
 | 
					                stage::POST_UPDATE,
 | 
				
			||||||
 | 
					                Self::print_diagnostics_debug_system.system(),
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            app.add_system_to_stage(stage::POST_UPDATE, Self::print_diagnostics_system.system());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl PrintDiagnosticsPlugin {
 | 
				
			||||||
 | 
					    pub fn filtered(filter: Vec<DiagnosticId>) -> Self {
 | 
				
			||||||
 | 
					        PrintDiagnosticsPlugin {
 | 
				
			||||||
 | 
					            filter: Some(filter),
 | 
				
			||||||
 | 
					            ..Default::default()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn print_diagnostic(diagnostic: &Diagnostic) {
 | 
				
			||||||
 | 
					        if let Some(value) = diagnostic.value() {
 | 
				
			||||||
 | 
					            print!("{:<20}: {:<19.6}", diagnostic.name, value);
 | 
				
			||||||
 | 
					            if let Some(average) = diagnostic.average() {
 | 
				
			||||||
 | 
					                print!("  (avg {:.6})", average);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            println!("\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn print_diagnostics_system(
 | 
				
			||||||
 | 
					        mut state: ResourceMut<PrintDiagnosticsState>,
 | 
				
			||||||
 | 
					        time: Resource<Time>,
 | 
				
			||||||
 | 
					        diagnostics: Resource<Diagnostics>,
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        state.elapsed += time.delta_seconds_f64;
 | 
				
			||||||
 | 
					        if state.elapsed >= state.wait_seconds {
 | 
				
			||||||
 | 
					            state.elapsed = 0.0;
 | 
				
			||||||
 | 
					            println!("Diagnostics:");
 | 
				
			||||||
 | 
					            println!("{}", "-".repeat(50));
 | 
				
			||||||
 | 
					            if let Some(ref filter) = state.filter {
 | 
				
			||||||
 | 
					                for diagnostic in filter.iter().map(|id| diagnostics.get(*id).unwrap()) {
 | 
				
			||||||
 | 
					                    Self::print_diagnostic(diagnostic);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                for diagnostic in diagnostics.iter() {
 | 
				
			||||||
 | 
					                    Self::print_diagnostic(diagnostic);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn print_diagnostics_debug_system(
 | 
				
			||||||
 | 
					        mut state: ResourceMut<PrintDiagnosticsState>,
 | 
				
			||||||
 | 
					        time: Resource<Time>,
 | 
				
			||||||
 | 
					        diagnostics: Resource<Diagnostics>,
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        state.elapsed += time.delta_seconds_f64;
 | 
				
			||||||
 | 
					        if state.elapsed >= state.wait_seconds {
 | 
				
			||||||
 | 
					            state.elapsed = 0.0;
 | 
				
			||||||
 | 
					            println!("Diagnostics (Debug):");
 | 
				
			||||||
 | 
					            println!("{}", "-".repeat(30));
 | 
				
			||||||
 | 
					            if let Some(ref filter) = state.filter {
 | 
				
			||||||
 | 
					                for diagnostic in filter.iter().map(|id| diagnostics.get(*id).unwrap()) {
 | 
				
			||||||
 | 
					                    println!("{:#?}\n", diagnostic);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                for diagnostic in diagnostics.iter() {
 | 
				
			||||||
 | 
					                    println!("{:#?}\n", diagnostic);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,2 +1,2 @@
 | 
				
			|||||||
mod wgpu_resource;
 | 
					mod wgpu_resource_diagnostics_plugin;
 | 
				
			||||||
pub use wgpu_resource::WgpuResourceDiagnosticPlugin;
 | 
					pub use wgpu_resource_diagnostics_plugin::WgpuResourceDiagnosticsPlugin;
 | 
				
			||||||
@ -5,16 +5,16 @@ use bevy_render::renderer::GlobalRenderResourceContext;
 | 
				
			|||||||
use legion::prelude::{IntoSystem, Resource, ResourceMut};
 | 
					use legion::prelude::{IntoSystem, Resource, ResourceMut};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Default)]
 | 
					#[derive(Default)]
 | 
				
			||||||
pub struct WgpuResourceDiagnosticPlugin;
 | 
					pub struct WgpuResourceDiagnosticsPlugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl AppPlugin for WgpuResourceDiagnosticPlugin {
 | 
					impl AppPlugin for WgpuResourceDiagnosticsPlugin {
 | 
				
			||||||
    fn build(&self, app: &mut AppBuilder) {
 | 
					    fn build(&self, app: &mut AppBuilder) {
 | 
				
			||||||
        app.add_startup_system(Self::setup_system.system())
 | 
					        app.add_startup_system(Self::setup_system.system())
 | 
				
			||||||
            .add_system(Self::diagnostic_system.system());
 | 
					            .add_system(Self::diagnostic_system.system());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl WgpuResourceDiagnosticPlugin {
 | 
					impl WgpuResourceDiagnosticsPlugin {
 | 
				
			||||||
    pub const WINDOW_SURFACES: DiagnosticId =
 | 
					    pub const WINDOW_SURFACES: DiagnosticId =
 | 
				
			||||||
        DiagnosticId::from_u128(108237028251680341878766034324149135605);
 | 
					        DiagnosticId::from_u128(108237028251680341878766034324149135605);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1,11 +1,14 @@
 | 
				
			|||||||
use bevy::{diagnostic::FrameTimeDiagnosticsPlugin, prelude::*};
 | 
					use bevy::{
 | 
				
			||||||
 | 
					    diagnostic::{FrameTimeDiagnosticsPlugin, PrintDiagnosticsPlugin},
 | 
				
			||||||
 | 
					    prelude::*,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
use rand::{rngs::StdRng, Rng, SeedableRng};
 | 
					use rand::{rngs::StdRng, Rng, SeedableRng};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() {
 | 
					fn main() {
 | 
				
			||||||
    App::build()
 | 
					    App::build()
 | 
				
			||||||
        .add_default_plugins()
 | 
					        .add_default_plugins()
 | 
				
			||||||
        .add_plugin(DiagnosticsPlugin::default())
 | 
					 | 
				
			||||||
        .add_plugin(FrameTimeDiagnosticsPlugin::default())
 | 
					        .add_plugin(FrameTimeDiagnosticsPlugin::default())
 | 
				
			||||||
 | 
					        .add_plugin(PrintDiagnosticsPlugin::default())
 | 
				
			||||||
        .add_startup_system(setup)
 | 
					        .add_startup_system(setup)
 | 
				
			||||||
        .add_system(move_system.system())
 | 
					        .add_system(move_system.system())
 | 
				
			||||||
        .run();
 | 
					        .run();
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,9 @@ impl AddDefaultPlugins for AppBuilder {
 | 
				
			|||||||
        #[cfg(feature = "core")]
 | 
					        #[cfg(feature = "core")]
 | 
				
			||||||
        self.add_plugin(bevy_core::CorePlugin::default());
 | 
					        self.add_plugin(bevy_core::CorePlugin::default());
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        #[cfg(feature = "diagnostic")]
 | 
				
			||||||
 | 
					        self.add_plugin(bevy_diagnostic::DiagnosticsPlugin::default());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #[cfg(feature = "input")]
 | 
					        #[cfg(feature = "input")]
 | 
				
			||||||
        self.add_plugin(bevy_input::InputPlugin::default());
 | 
					        self.add_plugin(bevy_input::InputPlugin::default());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user