From 36e3c0a8995d9af7136702c81734c9660f9ec506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Sat, 17 Apr 2021 01:13:07 +0200 Subject: [PATCH 1/2] split batches when iterating on a non dense query --- crates/bevy_ecs/src/query/state.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/query/state.rs b/crates/bevy_ecs/src/query/state.rs index 2f2f939a32d5f..7cff93bc01b19 100644 --- a/crates/bevy_ecs/src/query/state.rs +++ b/crates/bevy_ecs/src/query/state.rs @@ -446,7 +446,8 @@ where fetch.set_archetype(&self.fetch_state, archetype, tables); filter.set_archetype(&self.filter_state, archetype, tables); - for archetype_index in 0..archetype.len() { + let len = batch_size.min(archetype.len() - offset); + for archetype_index in offset..offset + len { if !filter.archetype_filter_fetch(archetype_index) { continue; } From 48062c8b33570fa686b12fe6e879c92aa0d11a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Mockers?= Date: Sat, 17 Apr 2021 02:03:29 +0200 Subject: [PATCH 2/2] add test --- crates/bevy_ecs/src/lib.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/crates/bevy_ecs/src/lib.rs b/crates/bevy_ecs/src/lib.rs index 4db81495b3866..773ba865b5479 100644 --- a/crates/bevy_ecs/src/lib.rs +++ b/crates/bevy_ecs/src/lib.rs @@ -249,7 +249,7 @@ mod tests { } #[test] - fn par_for_each() { + fn par_for_each_dense() { let mut world = World::new(); let task_pool = TaskPool::default(); let e1 = world.spawn().insert(1).id(); @@ -268,6 +268,29 @@ mod tests { ); } + #[test] + fn par_for_each_sparse() { + let mut world = World::new(); + world + .register_component(ComponentDescriptor::new::(StorageType::SparseSet)) + .unwrap(); + let task_pool = TaskPool::default(); + let e1 = world.spawn().insert(1).id(); + let e2 = world.spawn().insert(2).id(); + let e3 = world.spawn().insert(3).id(); + let e4 = world.spawn().insert_bundle((4, true)).id(); + let e5 = world.spawn().insert_bundle((5, true)).id(); + let results = Arc::new(Mutex::new(Vec::new())); + world + .query::<(Entity, &i32)>() + .par_for_each(&world, &task_pool, 2, |(e, &i)| results.lock().push((e, i))); + results.lock().sort(); + assert_eq!( + &*results.lock(), + &[(e1, 1), (e2, 2), (e3, 3), (e4, 4), (e5, 5)] + ); + } + #[test] fn query_missing_component() { let mut world = World::new();