Move system_commands spans into apply_buffers (#6900)
# Objective A separate `tracing` span for running a system's commands is created, even if the system doesn't have commands. This is adding extra measuring overhead (see #4892) where it's not needed. ## Solution Move the span into `ParallelCommandState` and `CommandQueue`'s `SystemParamState::apply`. To get the right metadata for the span, a additional `&SystemMeta` parameter was added to `SystemParamState::apply`. --- ## Changelog Added: `SystemMeta::name` Changed: Systems without `Commands` and `ParallelCommands` will no longer show a "system_commands" span when profiling. Changed: `SystemParamState::apply` now takes a `&SystemMeta` parameter in addition to the provided `&mut World`.
This commit is contained in:
		
							parent
							
								
									4820917af6
								
							
						
					
					
						commit
						79b9231b74
					
				@ -285,8 +285,8 @@ pub fn impl_param_set(_input: TokenStream) -> TokenStream {
 | 
			
		||||
                    )*
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                fn apply(&mut self, world: &mut World) {
 | 
			
		||||
                    self.0.apply(world)
 | 
			
		||||
                fn apply(&mut self, system_meta: &SystemMeta, world: &mut World) {
 | 
			
		||||
                    self.0.apply(system_meta, world)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                #[inline]
 | 
			
		||||
@ -466,8 +466,8 @@ pub fn derive_system_param(input: TokenStream) -> TokenStream {
 | 
			
		||||
                    self.state.new_archetype(archetype, system_meta)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                fn apply(&mut self, world: &mut #path::world::World) {
 | 
			
		||||
                    self.state.apply(world)
 | 
			
		||||
                fn apply(&mut self, system_meta: &#path::system::SystemMeta, world: &mut #path::world::World) {
 | 
			
		||||
                    self.state.apply(system_meta, world)
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                unsafe fn get_param<'w, 's>(
 | 
			
		||||
 | 
			
		||||
@ -229,12 +229,10 @@ impl SystemStage {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn apply_buffers(&mut self, world: &mut World) {
 | 
			
		||||
        #[cfg(feature = "trace")]
 | 
			
		||||
        let _span = bevy_utils::tracing::info_span!("stage::apply_buffers").entered();
 | 
			
		||||
        for container in &mut self.parallel {
 | 
			
		||||
            let system = container.system_mut();
 | 
			
		||||
            #[cfg(feature = "trace")]
 | 
			
		||||
            let _span = bevy_utils::tracing::info_span!("system_commands", name = &*system.name())
 | 
			
		||||
                .entered();
 | 
			
		||||
            system.apply_buffers(world);
 | 
			
		||||
            container.system_mut().apply_buffers(world);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -781,15 +779,7 @@ impl Stage for SystemStage {
 | 
			
		||||
                            .entered();
 | 
			
		||||
                            container.system_mut().run((), world);
 | 
			
		||||
                        }
 | 
			
		||||
                        {
 | 
			
		||||
                            #[cfg(feature = "trace")]
 | 
			
		||||
                            let _system_span = bevy_utils::tracing::info_span!(
 | 
			
		||||
                                "system_commands",
 | 
			
		||||
                                name = &*container.name()
 | 
			
		||||
                            )
 | 
			
		||||
                            .entered();
 | 
			
		||||
                            container.system_mut().apply_buffers(world);
 | 
			
		||||
                        }
 | 
			
		||||
                        container.system_mut().apply_buffers(world);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@ -813,15 +803,7 @@ impl Stage for SystemStage {
 | 
			
		||||
                            .entered();
 | 
			
		||||
                            container.system_mut().run((), world);
 | 
			
		||||
                        }
 | 
			
		||||
                        {
 | 
			
		||||
                            #[cfg(feature = "trace")]
 | 
			
		||||
                            let _system_span = bevy_utils::tracing::info_span!(
 | 
			
		||||
                                "system_commands",
 | 
			
		||||
                                name = &*container.name()
 | 
			
		||||
                            )
 | 
			
		||||
                            .entered();
 | 
			
		||||
                            container.system_mut().apply_buffers(world);
 | 
			
		||||
                        }
 | 
			
		||||
                        container.system_mut().apply_buffers(world);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@ -829,12 +811,6 @@ impl Stage for SystemStage {
 | 
			
		||||
                if self.apply_buffers {
 | 
			
		||||
                    for container in &mut self.parallel {
 | 
			
		||||
                        if container.should_run {
 | 
			
		||||
                            #[cfg(feature = "trace")]
 | 
			
		||||
                            let _span = bevy_utils::tracing::info_span!(
 | 
			
		||||
                                "system_commands",
 | 
			
		||||
                                name = &*container.name()
 | 
			
		||||
                            )
 | 
			
		||||
                            .entered();
 | 
			
		||||
                            container.system_mut().apply_buffers(world);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
@ -852,15 +828,7 @@ impl Stage for SystemStage {
 | 
			
		||||
                            .entered();
 | 
			
		||||
                            container.system_mut().run((), world);
 | 
			
		||||
                        }
 | 
			
		||||
                        {
 | 
			
		||||
                            #[cfg(feature = "trace")]
 | 
			
		||||
                            let _system_span = bevy_utils::tracing::info_span!(
 | 
			
		||||
                                "system_commands",
 | 
			
		||||
                                name = &*container.name()
 | 
			
		||||
                            )
 | 
			
		||||
                            .entered();
 | 
			
		||||
                            container.system_mut().apply_buffers(world);
 | 
			
		||||
                        }
 | 
			
		||||
                        container.system_mut().apply_buffers(world);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ use thread_local::ThreadLocal;
 | 
			
		||||
use crate::{
 | 
			
		||||
    entity::Entities,
 | 
			
		||||
    prelude::World,
 | 
			
		||||
    system::{SystemParam, SystemParamState},
 | 
			
		||||
    system::{SystemMeta, SystemParam, SystemParamState},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use super::{CommandQueue, Commands};
 | 
			
		||||
@ -60,7 +60,11 @@ unsafe impl SystemParamState for ParallelCommandsState {
 | 
			
		||||
        Self::default()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn apply(&mut self, world: &mut World) {
 | 
			
		||||
    fn apply(&mut self, _system_meta: &SystemMeta, world: &mut World) {
 | 
			
		||||
        #[cfg(feature = "trace")]
 | 
			
		||||
        let _system_span =
 | 
			
		||||
            bevy_utils::tracing::info_span!("system_commands", name = _system_meta.name())
 | 
			
		||||
                .entered();
 | 
			
		||||
        for cq in &mut self.thread_local_storage {
 | 
			
		||||
            cq.get_mut().apply(world);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -37,6 +37,12 @@ impl SystemMeta {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Returns the system's name
 | 
			
		||||
    #[inline]
 | 
			
		||||
    pub fn name(&self) -> &str {
 | 
			
		||||
        &self.name
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Returns true if the system is [`Send`].
 | 
			
		||||
    #[inline]
 | 
			
		||||
    pub fn is_send(&self) -> bool {
 | 
			
		||||
@ -182,7 +188,7 @@ impl<Param: SystemParam> SystemState<Param> {
 | 
			
		||||
    /// This function should be called manually after the values returned by [`SystemState::get`] and [`SystemState::get_mut`]
 | 
			
		||||
    /// are finished being used.
 | 
			
		||||
    pub fn apply(&mut self, world: &mut World) {
 | 
			
		||||
        self.param_state.apply(world);
 | 
			
		||||
        self.param_state.apply(&self.meta, world);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[inline]
 | 
			
		||||
@ -416,7 +422,7 @@ where
 | 
			
		||||
    #[inline]
 | 
			
		||||
    fn apply_buffers(&mut self, world: &mut World) {
 | 
			
		||||
        let param_state = self.param_state.as_mut().expect(Self::PARAM_MESSAGE);
 | 
			
		||||
        param_state.apply(world);
 | 
			
		||||
        param_state.apply(&self.system_meta, world);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[inline]
 | 
			
		||||
 | 
			
		||||
@ -140,7 +140,8 @@ pub unsafe trait SystemParamState: Send + Sync + 'static {
 | 
			
		||||
    #[inline]
 | 
			
		||||
    fn new_archetype(&mut self, _archetype: &Archetype, _system_meta: &mut SystemMeta) {}
 | 
			
		||||
    #[inline]
 | 
			
		||||
    fn apply(&mut self, _world: &mut World) {}
 | 
			
		||||
    #[allow(unused_variables)]
 | 
			
		||||
    fn apply(&mut self, system_meta: &SystemMeta, _world: &mut World) {}
 | 
			
		||||
 | 
			
		||||
    type Item<'world, 'state>: SystemParam<State = Self>;
 | 
			
		||||
    /// # Safety
 | 
			
		||||
@ -615,7 +616,11 @@ unsafe impl SystemParamState for CommandQueue {
 | 
			
		||||
        Default::default()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn apply(&mut self, world: &mut World) {
 | 
			
		||||
    fn apply(&mut self, _system_meta: &SystemMeta, world: &mut World) {
 | 
			
		||||
        #[cfg(feature = "trace")]
 | 
			
		||||
        let _system_span =
 | 
			
		||||
            bevy_utils::tracing::info_span!("system_commands", name = _system_meta.name())
 | 
			
		||||
                .entered();
 | 
			
		||||
        self.apply(world);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1473,9 +1478,9 @@ macro_rules! impl_system_param_tuple {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            #[inline]
 | 
			
		||||
            fn apply(&mut self, _world: &mut World) {
 | 
			
		||||
            fn apply(&mut self, _system_meta: &SystemMeta, _world: &mut World) {
 | 
			
		||||
                let ($($param,)*) = self;
 | 
			
		||||
                $($param.apply(_world);)*
 | 
			
		||||
                $($param.apply(_system_meta, _world);)*
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            #[inline]
 | 
			
		||||
@ -1611,8 +1616,8 @@ unsafe impl<S: SystemParamState, P: SystemParam<State = S> + 'static> SystemPara
 | 
			
		||||
        self.0.new_archetype(archetype, system_meta);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn apply(&mut self, world: &mut World) {
 | 
			
		||||
        self.0.apply(world);
 | 
			
		||||
    fn apply(&mut self, system_meta: &SystemMeta, world: &mut World) {
 | 
			
		||||
        self.0.apply(system_meta, world);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    unsafe fn get_param<'world, 'state>(
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user