Skip to content

Commit

Permalink
Update to fixedbitset 0.5 (#12512)
Browse files Browse the repository at this point in the history
# Objective
Improve code quality involving fixedbitset.

## Solution
Update to fixedbitset 0.5. Use the new `grow_and_insert` function
instead of `grow` and `insert` functions separately.

This should also speed up most of the set operations involving
fixedbitset. They should be ~2x faster, but testing this against the
stress tests seems to show little to no difference. The multithreaded
executor doesn't seem to be all that much faster in many_cubes and
many_foxes. These use cases are likely dominated by other operations or
the bitsets aren't big enough to make them the bottleneck.

This introduces a duplicate dependency due to petgraph and wgpu, but the
former may take some time to update.

## Changelog
Removed: `Access::grow`

## Migration Guide
`Access::grow` has been removed. It's no longer needed. Remove all
references to it.
  • Loading branch information
james7132 committed Mar 17, 2024
1 parent 1e1e11c commit 8327ce8
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 35 deletions.
2 changes: 1 addition & 1 deletion crates/bevy_animation/Cargo.toml
Expand Up @@ -28,7 +28,7 @@ bevy_transform = { path = "../bevy_transform", version = "0.14.0-dev" }
bevy_hierarchy = { path = "../bevy_hierarchy", version = "0.14.0-dev" }

# other
fixedbitset = "0.4"
fixedbitset = "0.5"
petgraph = { version = "0.6", features = ["serde-1"] }
ron = "0.8"
serde = "1"
Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_ecs/Cargo.toml
Expand Up @@ -25,7 +25,7 @@ petgraph = "0.6"

bitflags = "2.3"
concurrent-queue = "2.4.0"
fixedbitset = "0.4.2"
fixedbitset = "0.5"
rustc-hash = "1.1"
serde = "1"
thiserror = "1.0"
Expand Down
36 changes: 9 additions & 27 deletions crates/bevy_ecs/src/query/access.rs
Expand Up @@ -97,26 +97,17 @@ impl<T: SparseSetIndex> Access<T> {
}
}

/// Increases the set capacity to the specified amount.
///
/// Does nothing if `capacity` is less than or equal to the current value.
pub fn grow(&mut self, capacity: usize) {
self.reads_and_writes.grow(capacity);
self.writes.grow(capacity);
}

/// Adds access to the element given by `index`.
pub fn add_read(&mut self, index: T) {
self.reads_and_writes.grow(index.sparse_set_index() + 1);
self.reads_and_writes.insert(index.sparse_set_index());
self.reads_and_writes
.grow_and_insert(index.sparse_set_index());
}

/// Adds exclusive access to the element given by `index`.
pub fn add_write(&mut self, index: T) {
self.reads_and_writes.grow(index.sparse_set_index() + 1);
self.reads_and_writes.insert(index.sparse_set_index());
self.writes.grow(index.sparse_set_index() + 1);
self.writes.insert(index.sparse_set_index());
self.reads_and_writes
.grow_and_insert(index.sparse_set_index());
self.writes.grow_and_insert(index.sparse_set_index());
}

/// Adds an archetypal (indirect) access to the element given by `index`.
Expand All @@ -128,8 +119,7 @@ impl<T: SparseSetIndex> Access<T> {
///
/// [`Has<T>`]: crate::query::Has
pub fn add_archetypal(&mut self, index: T) {
self.archetypal.grow(index.sparse_set_index() + 1);
self.archetypal.insert(index.sparse_set_index());
self.archetypal.grow_and_insert(index.sparse_set_index());
}

/// Returns `true` if this can access the element given by `index`.
Expand Down Expand Up @@ -389,20 +379,16 @@ impl<T: SparseSetIndex> FilteredAccess<T> {
}

fn add_required(&mut self, index: T) {
let index = index.sparse_set_index();
self.required.grow(index + 1);
self.required.insert(index);
self.required.grow_and_insert(index.sparse_set_index());
}

/// Adds a `With` filter: corresponds to a conjunction (AND) operation.
///
/// Suppose we begin with `Or<(With<A>, With<B>)>`, which is represented by an array of two `AccessFilter` instances.
/// Adding `AND With<C>` via this method transforms it into the equivalent of `Or<((With<A>, With<C>), (With<B>, With<C>))>`.
pub fn and_with(&mut self, index: T) {
let index = index.sparse_set_index();
for filter in &mut self.filter_sets {
filter.with.grow(index + 1);
filter.with.insert(index);
filter.with.grow_and_insert(index.sparse_set_index());
}
}

Expand All @@ -411,10 +397,8 @@ impl<T: SparseSetIndex> FilteredAccess<T> {
/// Suppose we begin with `Or<(With<A>, With<B>)>`, which is represented by an array of two `AccessFilter` instances.
/// Adding `AND Without<C>` via this method transforms it into the equivalent of `Or<((With<A>, Without<C>), (With<B>, Without<C>))>`.
pub fn and_without(&mut self, index: T) {
let index = index.sparse_set_index();
for filter in &mut self.filter_sets {
filter.without.grow(index + 1);
filter.without.insert(index);
filter.without.grow_and_insert(index.sparse_set_index());
}
}

Expand Down Expand Up @@ -689,7 +673,6 @@ mod tests {
fn read_all_access_conflicts() {
// read_all / single write
let mut access_a = Access::<usize>::default();
access_a.grow(10);
access_a.add_write(0);

let mut access_b = Access::<usize>::default();
Expand All @@ -699,7 +682,6 @@ mod tests {

// read_all / read_all
let mut access_a = Access::<usize>::default();
access_a.grow(10);
access_a.read_all();

let mut access_b = Access::<usize>::default();
Expand Down
6 changes: 2 additions & 4 deletions crates/bevy_ecs/src/query/state.rs
Expand Up @@ -312,14 +312,12 @@ impl<D: QueryData, F: QueryFilter> QueryState<D, F> {

let archetype_index = archetype.id().index();
if !self.matched_archetypes.contains(archetype_index) {
self.matched_archetypes.grow(archetype_index + 1);
self.matched_archetypes.set(archetype_index, true);
self.matched_archetypes.grow_and_insert(archetype_index);
self.matched_archetype_ids.push(archetype.id());
}
let table_index = archetype.table_id().as_usize();
if !self.matched_tables.contains(table_index) {
self.matched_tables.grow(table_index + 1);
self.matched_tables.set(table_index, true);
self.matched_tables.grow_and_insert(table_index);
self.matched_table_ids.push(archetype.table_id());
}
}
Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_pbr/Cargo.toml
Expand Up @@ -35,7 +35,7 @@ bevy_derive = { path = "../bevy_derive", version = "0.14.0-dev" }

# other
bitflags = "2.3"
fixedbitset = "0.4"
fixedbitset = "0.5"
# direct dependency required for derive macro
bytemuck = { version = "1", features = ["derive"] }
radsort = "0.1"
Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_sprite/Cargo.toml
Expand Up @@ -30,7 +30,7 @@ bevy_derive = { path = "../bevy_derive", version = "0.14.0-dev" }

# other
bytemuck = { version = "1.5", features = ["derive"] }
fixedbitset = "0.4"
fixedbitset = "0.5"
guillotiere = "0.6.0"
thiserror = "1.0"
rectangle-pack = "0.4"
Expand Down

0 comments on commit 8327ce8

Please sign in to comment.