par_for_each: split batches when iterating on a sparse query (#1945)
Fixes #1943 Each batch was iterating over the complete query
This commit is contained in:
parent
20673dbe0e
commit
2bd8ed57d0
@ -249,7 +249,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn par_for_each() {
|
fn par_for_each_dense() {
|
||||||
let mut world = World::new();
|
let mut world = World::new();
|
||||||
let task_pool = TaskPool::default();
|
let task_pool = TaskPool::default();
|
||||||
let e1 = world.spawn().insert(1).id();
|
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::<i32>(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]
|
#[test]
|
||||||
fn query_missing_component() {
|
fn query_missing_component() {
|
||||||
let mut world = World::new();
|
let mut world = World::new();
|
||||||
|
|||||||
@ -446,7 +446,8 @@ where
|
|||||||
fetch.set_archetype(&self.fetch_state, archetype, tables);
|
fetch.set_archetype(&self.fetch_state, archetype, tables);
|
||||||
filter.set_archetype(&self.filter_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) {
|
if !filter.archetype_filter_fetch(archetype_index) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user