From 053f1f48da46bd31afb73637719e359bc51776f2 Mon Sep 17 00:00:00 2001 From: lisk77 Date: Wed, 26 Nov 2025 00:38:07 +0100 Subject: [PATCH] refactor(ecs): another small speedup for archetypes --- crates/comet_ecs/src/scene.rs | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/crates/comet_ecs/src/scene.rs b/crates/comet_ecs/src/scene.rs index 8634527..4d76542 100755 --- a/crates/comet_ecs/src/scene.rs +++ b/crates/comet_ecs/src/scene.rs @@ -357,18 +357,25 @@ impl Scene { return; } - let entities = self.get_entities_with(vec![C::type_id(), K::type_id()]); - for entity in entities { - let (c_set, k_set) = self - .components - .get_two_mut(&C::type_id(), &K::type_id()); + let required = ComponentSet::from_ids(vec![C::type_id(), K::type_id()]); + let (c_set, k_set) = self + .components + .get_two_mut(&C::type_id(), &K::type_id()); - let idx = entity.index as usize; - let c_opt = c_set.and_then(|set| set.get_mut::(idx)); - let k_opt = k_set.and_then(|set| set.get_mut::(idx)); - - if let (Some(c), Some(k)) = (c_opt, k_opt) { - func(c, k); + if let (Some(c_store), Some(k_store)) = (c_set, k_set) { + for archetype_set in self.archetypes.component_sets() { + if required.is_subset(archetype_set) { + if let Some(entities) = self.archetypes.get_archetype(archetype_set) { + for &idx in entities { + let idx = idx as usize; + if let (Some(c), Some(k)) = + (c_store.get_mut::(idx), k_store.get_mut::(idx)) + { + func(c, k); + } + } + } + } } } }