Reuse VisibleEntities in check_light_mesh_visibilty (#13894)
# Objective - After #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` 
This commit is contained in:
		
							parent
							
								
									53910e07ae
								
							
						
					
					
						commit
						41ad4e98de
					
				| @ -682,11 +682,11 @@ pub fn check_light_mesh_visibility( | |||||||
|     >, |     >, | ||||||
|     visible_entity_ranges: Option<Res<VisibleEntityRanges>>, |     visible_entity_ranges: Option<Res<VisibleEntityRanges>>, | ||||||
| ) { | ) { | ||||||
|     fn shrink_entities(visible_entities: &mut VisibleEntities) { |     fn shrink_entities(visible_entities: &mut Vec<Entity>) { | ||||||
|         // Check that visible entities capacity() is no more than two times greater than len()
 |         // Check that visible entities capacity() is no more than two times greater than len()
 | ||||||
|         let capacity = visible_entities.entities.capacity(); |         let capacity = visible_entities.capacity(); | ||||||
|         let reserved = capacity |         let reserved = capacity | ||||||
|             .checked_div(visible_entities.entities.len()) |             .checked_div(visible_entities.len()) | ||||||
|             .map_or(0, |reserve| { |             .map_or(0, |reserve| { | ||||||
|                 if reserve > 2 { |                 if reserve > 2 { | ||||||
|                     capacity / (reserve / 2) |                     capacity / (reserve / 2) | ||||||
| @ -695,7 +695,7 @@ pub fn check_light_mesh_visibility( | |||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
|         visible_entities.entities.shrink_to(reserved); |         visible_entities.shrink_to(reserved); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let visible_entity_ranges = visible_entity_ranges.as_deref(); |     let visible_entity_ranges = visible_entity_ranges.as_deref(); | ||||||
| @ -712,7 +712,7 @@ pub fn check_light_mesh_visibility( | |||||||
|                     cascade_view_entities.resize(view_frusta.len(), Default::default()); |                     cascade_view_entities.resize(view_frusta.len(), Default::default()); | ||||||
|                     cascade_view_entities |                     cascade_view_entities | ||||||
|                         .iter_mut() |                         .iter_mut() | ||||||
|                         .for_each(|x| x.entities.clear()); |                         .for_each(|x| x.clear::<WithMesh>()); | ||||||
|                 } |                 } | ||||||
|                 None => views_to_remove.push(*view), |                 None => views_to_remove.push(*view), | ||||||
|             }; |             }; | ||||||
| @ -798,7 +798,10 @@ pub fn check_light_mesh_visibility( | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         for (_, cascade_view_entities) in &mut visible_entities.entities { |         for (_, cascade_view_entities) in &mut visible_entities.entities { | ||||||
|             cascade_view_entities.iter_mut().for_each(shrink_entities); |             cascade_view_entities | ||||||
|  |                 .iter_mut() | ||||||
|  |                 .map(|x| x.get_mut::<WithMesh>()) | ||||||
|  |                 .for_each(shrink_entities); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -814,7 +817,7 @@ pub fn check_light_mesh_visibility( | |||||||
|             )) = point_lights.get_mut(light_entity) |             )) = point_lights.get_mut(light_entity) | ||||||
|             { |             { | ||||||
|                 for visible_entities in cubemap_visible_entities.iter_mut() { |                 for visible_entities in cubemap_visible_entities.iter_mut() { | ||||||
|                     visible_entities.entities.clear(); |                     visible_entities.clear::<WithMesh>(); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 // NOTE: If shadow mapping is disabled for the light then it must have no visible entities
 |                 // NOTE: If shadow mapping is disabled for the light then it must have no visible entities
 | ||||||
| @ -882,7 +885,7 @@ pub fn check_light_mesh_visibility( | |||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 for visible_entities in cubemap_visible_entities.iter_mut() { |                 for visible_entities in cubemap_visible_entities.iter_mut() { | ||||||
|                     shrink_entities(visible_entities); |                     shrink_entities(visible_entities.get_mut::<WithMesh>()); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
| @ -890,7 +893,7 @@ pub fn check_light_mesh_visibility( | |||||||
|             if let Ok((point_light, transform, frustum, mut visible_entities, maybe_view_mask)) = |             if let Ok((point_light, transform, frustum, mut visible_entities, maybe_view_mask)) = | ||||||
|                 spot_lights.get_mut(light_entity) |                 spot_lights.get_mut(light_entity) | ||||||
|             { |             { | ||||||
|                 visible_entities.entities.clear(); |                 visible_entities.clear::<WithMesh>(); | ||||||
| 
 | 
 | ||||||
|                 // NOTE: If shadow mapping is disabled for the light then it must have no visible entities
 |                 // NOTE: If shadow mapping is disabled for the light then it must have no visible entities
 | ||||||
|                 if !point_light.shadows_enabled { |                 if !point_light.shadows_enabled { | ||||||
| @ -949,7 +952,7 @@ pub fn check_light_mesh_visibility( | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 shrink_entities(&mut visible_entities); |                 shrink_entities(visible_entities.get_mut::<WithMesh>()); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 re0312
						re0312