mirror of
https://github.com/emilk/egui.git
synced 2026-08-29 04:40:03 -04:00
Avoid cloning Rows during Galley::concat (#7649)
<!-- Please read the "Making a PR" section of [`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/main/CONTRIBUTING.md) before opening a Pull Request! * Keep your PR:s small and focused. * The PR title is what ends up in the changelog, so make it descriptive! * If applicable, add a screenshot or gif. * If it is a non-trivial addition, consider adding a demo for it to `egui_demo_lib`, or a new example. * Do NOT open PR:s from your `master` branch, as that makes it hard for maintainers to test and add commits to your PR. * Remember to run `cargo fmt` and `cargo clippy`. * Open the PR as a draft until you have self-reviewed it and run `./scripts/check.sh`. * When you have addressed a PR comment, mark it as resolved. Please be patient! I will review your PR, but my time is limited! --> Moves `ends_with_newline` into `PlacedRow` to avoid clones during layout. I don't think there was a rationale stronger than "don't change too much" for not doing this in https://github.com/emilk/egui/pull/5411, so I should've just done this from the start. This was a significant part of the profile for text layout (as it cloned almost every `Row`, even though it only needed to change a single boolean). Before: <img width="757" height="250" alt="image" src="https://github.com/user-attachments/assets/d1c2afd1-f1ec-4cf5-9d05-f5a5a78052df" /> After: <img width="615" height="249" alt="image" src="https://github.com/user-attachments/assets/c70966da-c892-4e84-adba-494d0f37f263" /> (note that these profiles focus solely on the top-level `Galley::layout_inline` subtree, also don't compare sample count as the duration of these tests was completely arbitrary) egui_demo_lib `*text_layout*` benches: <img width="791" height="461" alt="image" src="https://github.com/user-attachments/assets/4f97ce84-2768-4876-9488-d42f8f358ed1" /> * [X] I have followed the instructions in the PR template (As usual, the tests fail for me even on master but the failures on master and with these changes seem the same :))
This commit is contained in:
committed by
GitHub
parent
2669344d5c
commit
e861c8ec79
@@ -296,8 +296,8 @@ fn rows_from_paragraphs(
|
||||
glyphs: vec![],
|
||||
visuals: Default::default(),
|
||||
size: vec2(0.0, paragraph.empty_paragraph_height),
|
||||
ends_with_newline: !is_last_paragraph,
|
||||
}),
|
||||
ends_with_newline: !is_last_paragraph,
|
||||
});
|
||||
} else {
|
||||
let paragraph_max_x = paragraph.glyphs.last().unwrap().max_x();
|
||||
@@ -310,14 +310,13 @@ fn rows_from_paragraphs(
|
||||
glyphs: paragraph.glyphs,
|
||||
visuals: Default::default(),
|
||||
size: vec2(paragraph_max_x, 0.0),
|
||||
ends_with_newline: !is_last_paragraph,
|
||||
}),
|
||||
ends_with_newline: !is_last_paragraph,
|
||||
});
|
||||
} else {
|
||||
line_break(¶graph, job, &mut rows, elided);
|
||||
let placed_row = rows.last_mut().unwrap();
|
||||
let row = Arc::make_mut(&mut placed_row.row);
|
||||
row.ends_with_newline = !is_last_paragraph;
|
||||
placed_row.ends_with_newline = !is_last_paragraph;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -363,8 +362,8 @@ fn line_break(
|
||||
glyphs: vec![],
|
||||
visuals: Default::default(),
|
||||
size: Vec2::ZERO,
|
||||
ends_with_newline: false,
|
||||
}),
|
||||
ends_with_newline: false,
|
||||
});
|
||||
row_start_x += first_row_indentation;
|
||||
first_row_indentation = 0.0;
|
||||
@@ -389,8 +388,8 @@ fn line_break(
|
||||
glyphs,
|
||||
visuals: Default::default(),
|
||||
size: vec2(paragraph_max_x, 0.0),
|
||||
ends_with_newline: false,
|
||||
}),
|
||||
ends_with_newline: false,
|
||||
});
|
||||
|
||||
// Start a new row:
|
||||
@@ -431,8 +430,8 @@ fn line_break(
|
||||
glyphs,
|
||||
visuals: Default::default(),
|
||||
size: vec2(paragraph_max_x - paragraph_min_x, 0.0),
|
||||
ends_with_newline: false,
|
||||
}),
|
||||
ends_with_newline: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user