Skip to content

Commit 41ad4e9

Browse files
authored
Reuse VisibleEntities in check_light_mesh_visibilty (bevyengine#13894)
# Objective - After bevyengine#12582 , Bevy split visibleEntities into a TypeIdMap for different types of entities, but the behavior in `check_light_mesh_visibility `simply calls HashMap::clear(), which will reallocate memory every frame. ## Testing cargo run --release --example many_cubes --features bevy/trace_tracy -- --shadows ~10% win in `check_light_mesh_visibilty` ![image](https://github.com/bevyengine/bevy/assets/45868716/1bf4deef-bab2-4e5f-9f60-bea8b7e33e3e)
1 parent 53910e0 commit 41ad4e9

File tree

1 file changed

+13
-10
lines changed
  • crates/bevy_pbr/src/light

1 file changed

+13
-10
lines changed

crates/bevy_pbr/src/light/mod.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -682,11 +682,11 @@ pub fn check_light_mesh_visibility(
682682
>,
683683
visible_entity_ranges: Option<Res<VisibleEntityRanges>>,
684684
) {
685-
fn shrink_entities(visible_entities: &mut VisibleEntities) {
685+
fn shrink_entities(visible_entities: &mut Vec<Entity>) {
686686
// Check that visible entities capacity() is no more than two times greater than len()
687-
let capacity = visible_entities.entities.capacity();
687+
let capacity = visible_entities.capacity();
688688
let reserved = capacity
689-
.checked_div(visible_entities.entities.len())
689+
.checked_div(visible_entities.len())
690690
.map_or(0, |reserve| {
691691
if reserve > 2 {
692692
capacity / (reserve / 2)
@@ -695,7 +695,7 @@ pub fn check_light_mesh_visibility(
695695
}
696696
});
697697

698-
visible_entities.entities.shrink_to(reserved);
698+
visible_entities.shrink_to(reserved);
699699
}
700700

701701
let visible_entity_ranges = visible_entity_ranges.as_deref();
@@ -712,7 +712,7 @@ pub fn check_light_mesh_visibility(
712712
cascade_view_entities.resize(view_frusta.len(), Default::default());
713713
cascade_view_entities
714714
.iter_mut()
715-
.for_each(|x| x.entities.clear());
715+
.for_each(|x| x.clear::<WithMesh>());
716716
}
717717
None => views_to_remove.push(*view),
718718
};
@@ -798,7 +798,10 @@ pub fn check_light_mesh_visibility(
798798
}
799799

800800
for (_, cascade_view_entities) in &mut visible_entities.entities {
801-
cascade_view_entities.iter_mut().for_each(shrink_entities);
801+
cascade_view_entities
802+
.iter_mut()
803+
.map(|x| x.get_mut::<WithMesh>())
804+
.for_each(shrink_entities);
802805
}
803806
}
804807

@@ -814,7 +817,7 @@ pub fn check_light_mesh_visibility(
814817
)) = point_lights.get_mut(light_entity)
815818
{
816819
for visible_entities in cubemap_visible_entities.iter_mut() {
817-
visible_entities.entities.clear();
820+
visible_entities.clear::<WithMesh>();
818821
}
819822

820823
// NOTE: If shadow mapping is disabled for the light then it must have no visible entities
@@ -882,15 +885,15 @@ pub fn check_light_mesh_visibility(
882885
}
883886

884887
for visible_entities in cubemap_visible_entities.iter_mut() {
885-
shrink_entities(visible_entities);
888+
shrink_entities(visible_entities.get_mut::<WithMesh>());
886889
}
887890
}
888891

889892
// Spot lights
890893
if let Ok((point_light, transform, frustum, mut visible_entities, maybe_view_mask)) =
891894
spot_lights.get_mut(light_entity)
892895
{
893-
visible_entities.entities.clear();
896+
visible_entities.clear::<WithMesh>();
894897

895898
// NOTE: If shadow mapping is disabled for the light then it must have no visible entities
896899
if !point_light.shadows_enabled {
@@ -949,7 +952,7 @@ pub fn check_light_mesh_visibility(
949952
}
950953
}
951954

952-
shrink_entities(&mut visible_entities);
955+
shrink_entities(visible_entities.get_mut::<WithMesh>());
953956
}
954957
}
955958
}

0 commit comments

Comments
 (0)