Vectorize reset_view_visibility (#12797)

# Objective
Speed up CPU-side rendering.

## Solution
Use `QueryIter::for_each` and `Mut::bypass_change_detection` to minimize
the total amount of data being written and allow autovectorization to
speed up iteration.

## Performance
Tested against the default `many_cubes`, this results in greater than
15x speed up: 281us -> 18.4us.

![image](https://github.com/bevyengine/bevy/assets/3137680/18369285-843e-4eb6-9716-c99c6f5ea4e2)

As `ViewVisibility::HIDDEN` just wraps false, this is likely just
degenerating into `memset(0)`s on the tables.
This commit is contained in:
James Liu 2024-03-30 01:28:16 -07:00 committed by GitHub
parent 4dadebd9c4
commit 24030d2a0c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -357,12 +357,12 @@ fn propagate_recursive(
/// Entities that are visible will be marked as such later this frame
/// by a [`VisibilitySystems::CheckVisibility`] system.
fn reset_view_visibility(mut query: Query<&mut ViewVisibility>) {
for mut view_visibility in &mut query {
query.iter_mut().for_each(|mut view_visibility| {
// NOTE: We do not use `set_if_neq` here, as we don't care about
// change detection for view visibility, and adding a branch to every
// loop iteration would pessimize performance.
*view_visibility = ViewVisibility::HIDDEN;
}
*view_visibility.bypass_change_detection() = ViewVisibility::HIDDEN;
});
}
/// System updating the visibility of entities each frame.