Skip to content

Commit 5ff7062

Browse files
authored
Switch bins from parallel key/value arrays to IndexMaps. (#17819)
Conceptually, bins are ordered hash maps. We currently implement these as a list of keys with an associated hash map. But we already have a data type that implements ordered hash maps directly: `IndexMap`. This patch switches Bevy to use `IndexMap`s for bins. Because we're memory bound, this doesn't affect performance much, but it is cleaner.
1 parent 267a0d0 commit 5ff7062

File tree

5 files changed

+72
-120
lines changed

5 files changed

+72
-120
lines changed

crates/bevy_core_pipeline/src/deferred/node.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,9 @@ impl ViewNode for DeferredGBufferPrepassNode {
147147
}
148148

149149
// Opaque draws
150-
if !opaque_deferred_phase.multidrawable_mesh_keys.is_empty()
151-
|| !opaque_deferred_phase.batchable_mesh_keys.is_empty()
152-
|| !opaque_deferred_phase.unbatchable_mesh_keys.is_empty()
150+
if !opaque_deferred_phase.multidrawable_meshes.is_empty()
151+
|| !opaque_deferred_phase.batchable_meshes.is_empty()
152+
|| !opaque_deferred_phase.unbatchable_meshes.is_empty()
153153
{
154154
#[cfg(feature = "trace")]
155155
let _opaque_prepass_span = info_span!("opaque_deferred_prepass").entered();

crates/bevy_render/src/batching/gpu_preprocessing.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,11 +1374,11 @@ pub fn batch_and_prepare_binned_render_phase<BPI, GFBD>(
13741374

13751375
// Prepare multidrawables.
13761376

1377-
for batch_set_key in &phase.multidrawable_mesh_keys {
1377+
for (batch_set_key, bins) in &phase.multidrawable_meshes {
13781378
let mut batch_set = None;
13791379
let indirect_parameters_base =
13801380
indirect_parameters_buffers.batch_count(batch_set_key.indexed()) as u32;
1381-
for (bin_key, bin) in &phase.multidrawable_mesh_values[batch_set_key] {
1381+
for (bin_key, bin) in bins {
13821382
let first_output_index = data_buffer.len() as u32;
13831383
let mut batch: Option<BinnedRenderPhaseBatch> = None;
13841384

@@ -1472,11 +1472,11 @@ pub fn batch_and_prepare_binned_render_phase<BPI, GFBD>(
14721472

14731473
// Prepare batchables.
14741474

1475-
for key in &phase.batchable_mesh_keys {
1475+
for (key, bin) in &phase.batchable_meshes {
14761476
let first_output_index = data_buffer.len() as u32;
14771477

14781478
let mut batch: Option<BinnedRenderPhaseBatch> = None;
1479-
for (&main_entity, &input_index) in phase.batchable_mesh_values[key].entities() {
1479+
for (&main_entity, &input_index) in bin.entities() {
14801480
let output_index = data_buffer.add() as u32;
14811481

14821482
match batch {
@@ -1589,9 +1589,7 @@ pub fn batch_and_prepare_binned_render_phase<BPI, GFBD>(
15891589
}
15901590

15911591
// Prepare unbatchables.
1592-
for key in &phase.unbatchable_mesh_keys {
1593-
let unbatchables = phase.unbatchable_mesh_values.get_mut(key).unwrap();
1594-
1592+
for (key, unbatchables) in &mut phase.unbatchable_meshes {
15951593
// Allocate the indirect parameters if necessary.
15961594
let mut indirect_parameters_offset = if no_indirect_drawing {
15971595
None

crates/bevy_render/src/batching/mod.rs

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -190,23 +190,9 @@ where
190190
BPI: BinnedPhaseItem,
191191
{
192192
for phase in phases.values_mut() {
193-
phase.multidrawable_mesh_keys.clear();
194-
phase
195-
.multidrawable_mesh_keys
196-
.extend(phase.multidrawable_mesh_values.keys().cloned());
197-
phase.multidrawable_mesh_keys.sort_unstable();
198-
199-
phase.batchable_mesh_keys.clear();
200-
phase
201-
.batchable_mesh_keys
202-
.extend(phase.batchable_mesh_values.keys().cloned());
203-
phase.batchable_mesh_keys.sort_unstable();
204-
205-
phase.unbatchable_mesh_keys.clear();
206-
phase
207-
.unbatchable_mesh_keys
208-
.extend(phase.unbatchable_mesh_values.keys().cloned());
209-
phase.unbatchable_mesh_keys.sort_unstable();
193+
phase.multidrawable_meshes.sort_unstable_keys();
194+
phase.batchable_meshes.sort_unstable_keys();
195+
phase.unbatchable_meshes.sort_unstable_keys();
210196
}
211197
}
212198

crates/bevy_render/src/batching/no_gpu_preprocessing.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ pub fn batch_and_prepare_binned_render_phase<BPI, GFBD>(
108108
for phase in phases.values_mut() {
109109
// Prepare batchables.
110110

111-
for key in &phase.batchable_mesh_keys {
111+
for bin in phase.batchable_meshes.values_mut() {
112112
let mut batch_set: SmallVec<[BinnedRenderPhaseBatch; 1]> = smallvec![];
113-
for main_entity in phase.batchable_mesh_values[key].entities().keys() {
113+
for main_entity in bin.entities().keys() {
114114
let Some(buffer_data) =
115115
GFBD::get_binned_batch_data(&system_param_item, *main_entity)
116116
else {
@@ -156,8 +156,7 @@ pub fn batch_and_prepare_binned_render_phase<BPI, GFBD>(
156156
}
157157

158158
// Prepare unbatchables.
159-
for key in &phase.unbatchable_mesh_keys {
160-
let unbatchables = phase.unbatchable_mesh_values.get_mut(key).unwrap();
159+
for unbatchables in phase.unbatchable_meshes.values_mut() {
161160
for main_entity in unbatchables.entities.keys() {
162161
let Some(buffer_data) =
163162
GFBD::get_binned_batch_data(&system_param_item, *main_entity)

0 commit comments

Comments
 (0)