diff --git a/crates/bevy_ecs/src/query/state.rs b/crates/bevy_ecs/src/query/state.rs index e64c257ec04b5..01e218b230b6e 100644 --- a/crates/bevy_ecs/src/query/state.rs +++ b/crates/bevy_ecs/src/query/state.rs @@ -12,7 +12,7 @@ use crate::{ world::{unsafe_world_cell::UnsafeWorldCell, World, WorldId}, }; #[cfg(feature = "trace")] -use bevy_utils::tracing::Instrument; +use bevy_utils::tracing::Span; use fixedbitset::FixedBitSet; use std::{any::TypeId, borrow::Borrow, fmt, mem::MaybeUninit}; @@ -39,6 +39,8 @@ pub struct QueryState { pub(crate) matched_archetype_ids: Vec, pub(crate) fetch_state: Q::State, pub(crate) filter_state: F::State, + #[cfg(feature = "trace")] + par_iter_span: Span, } impl std::fmt::Debug for QueryState { @@ -125,6 +127,12 @@ impl QueryState { matched_tables: Default::default(), matched_archetypes: Default::default(), archetype_component_access: Default::default(), + #[cfg(feature = "trace")] + par_iter_span: bevy_utils::tracing::info_span!( + "par_for_each", + query = std::any::type_name::(), + filter = std::any::type_name::(), + ), }; state.update_archetypes(world); state @@ -1205,7 +1213,9 @@ impl QueryState { while offset < table.entity_count() { let func = func.clone(); let len = batch_size.min(table.entity_count() - offset); - let task = async move { + scope.spawn(async move { + #[cfg(feature = "trace")] + let _span = self.par_iter_span.enter(); let mut fetch = Q::init_fetch(world, &self.fetch_state, last_run, this_run); let mut filter = @@ -1223,17 +1233,7 @@ impl QueryState { } func(Q::fetch(&mut fetch, *entity, row)); } - }; - #[cfg(feature = "trace")] - let span = bevy_utils::tracing::info_span!( - "par_for_each", - query = std::any::type_name::(), - filter = std::any::type_name::(), - count = len, - ); - #[cfg(feature = "trace")] - let task = task.instrument(span); - scope.spawn(task); + }); offset += batch_size; } } @@ -1249,7 +1249,9 @@ impl QueryState { while offset < archetype.len() { let func = func.clone(); let len = batch_size.min(archetype.len() - offset); - let task = async move { + scope.spawn(async move { + #[cfg(feature = "trace")] + let _span = self.par_iter_span.enter(); let mut fetch = Q::init_fetch(world, &self.fetch_state, last_run, this_run); let mut filter = @@ -1277,19 +1279,8 @@ impl QueryState { archetype_entity.table_row(), )); } - }; - - #[cfg(feature = "trace")] - let span = bevy_utils::tracing::info_span!( - "par_for_each", - query = std::any::type_name::(), - filter = std::any::type_name::(), - count = len, - ); - #[cfg(feature = "trace")] - let task = task.instrument(span); - - scope.spawn(task); + }); + offset += batch_size; } }