mirror of
https://github.com/bevyengine/bevy
synced 2024-11-10 07:04:33 +00:00
Update to fixedbitset 0.5 (#12512)
# 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.
This commit is contained in:
parent
1e1e11c4a6
commit
8327ce85d8
6 changed files with 15 additions and 35 deletions
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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`.
|
||||
|
@ -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`.
|
||||
|
@ -389,9 +379,7 @@ 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.
|
||||
|
@ -399,10 +387,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 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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue