Skip to content

Commit

Permalink
Don't reallocate scale factors in measure_text_system (#14999)
Browse files Browse the repository at this point in the history
# Objective

- Reuse allocation of `scale_factors` in `measure_text_system`.

## Solution

- Move it to a `Local`.
  • Loading branch information
UkoeHB authored Sep 2, 2024
1 parent 2b94a10 commit 3227c3d
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions crates/bevy_ui/src/widget/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,9 @@ fn create_text_measure(
/// is only able to detect that a `Text` component has changed and will regenerate the `Measure` on
/// color changes. This can be expensive, particularly for large blocks of text, and the [`bypass_change_detection`](bevy_ecs::change_detection::DetectChangesMut::bypass_change_detection)
/// method should be called when only changing the `Text`'s colors.
#[allow(clippy::too_many_arguments)]
pub fn measure_text_system(
mut scale_factors_buffer: Local<EntityHashMap<f32>>,
mut last_scale_factors: Local<EntityHashMap<f32>>,
fonts: Res<Assets<Font>>,
camera_query: Query<(Entity, &Camera)>,
Expand All @@ -171,14 +173,14 @@ pub fn measure_text_system(
>,
mut text_pipeline: ResMut<TextPipeline>,
) {
let mut scale_factors: EntityHashMap<f32> = EntityHashMap::default();
scale_factors_buffer.clear();

for (entity, text, content_size, text_flags, camera, mut buffer) in &mut text_query {
let Some(camera_entity) = camera.map(TargetCamera::entity).or(default_ui_camera.get())
else {
continue;
};
let scale_factor = match scale_factors.entry(camera_entity) {
let scale_factor = match scale_factors_buffer.entry(camera_entity) {
Entry::Occupied(entry) => *entry.get(),
Entry::Vacant(entry) => *entry.insert(
camera_query
Expand Down Expand Up @@ -208,7 +210,7 @@ pub fn measure_text_system(
);
}
}
*last_scale_factors = scale_factors;
std::mem::swap(&mut *last_scale_factors, &mut *scale_factors_buffer);
}

#[allow(clippy::too_many_arguments)]
Expand Down Expand Up @@ -284,6 +286,7 @@ fn queue_text(
#[allow(clippy::too_many_arguments)]
pub fn text_system(
mut textures: ResMut<Assets<Image>>,
mut scale_factors_buffer: Local<EntityHashMap<f32>>,
mut last_scale_factors: Local<EntityHashMap<f32>>,
fonts: Res<Assets<Font>>,
camera_query: Query<(Entity, &Camera)>,
Expand All @@ -301,14 +304,14 @@ pub fn text_system(
&mut CosmicBuffer,
)>,
) {
let mut scale_factors: EntityHashMap<f32> = EntityHashMap::default();
scale_factors_buffer.clear();

for (node, text, text_layout_info, text_flags, camera, mut buffer) in &mut text_query {
let Some(camera_entity) = camera.map(TargetCamera::entity).or(default_ui_camera.get())
else {
continue;
};
let scale_factor = match scale_factors.entry(camera_entity) {
let scale_factor = match scale_factors_buffer.entry(camera_entity) {
Entry::Occupied(entry) => *entry.get(),
Entry::Vacant(entry) => *entry.insert(
camera_query
Expand Down Expand Up @@ -341,5 +344,5 @@ pub fn text_system(
);
}
}
*last_scale_factors = scale_factors;
std::mem::swap(&mut *last_scale_factors, &mut *scale_factors_buffer);
}

0 comments on commit 3227c3d

Please sign in to comment.