perf(ui): transparent shaped-run cache lookup, no string copy on hit (#122)
ShapeText built ShapedRunKey{..., std::string(utf8)} before find()
unconditionally — even on cache hits, on the per-frame onBuild path.
N labels meant N string copies + hashes (+ frees for non-SSO strings)
every frame, partially defeating the run cache.
Add is_transparent hash + equality functors on shapedRuns_ and probe
with a borrowing ShapedRunViewKey {const Font*, float, array<float,4>,
string_view}. The owning std::string is now materialised only on a
miss, for emplace. Cache hits copy and hash no string.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
2783e47674
commit
c8495f548b
2 changed files with 51 additions and 9 deletions
|
|
@ -75,8 +75,11 @@ std::uint32_t UIRenderer::ShapeText(Font& font, float pxSize,
|
|||
// the pen starting at x=0, baseline=0 so a cache hit only needs the
|
||||
// translate below. The whole string is shaped (no outCapacity limit) so
|
||||
// a later call with a larger buffer still gets the full run.
|
||||
ShapedRunKey key{&font, pxSize, color, std::string(utf8)};
|
||||
auto it = shapedRuns_.find(key);
|
||||
// Probe with a borrowing view key (text is a string_view onto utf8) so a
|
||||
// cache hit copies and hashes no string. The owning std::string is only
|
||||
// built on a miss, below, for the emplace.
|
||||
ShapedRunViewKey viewKey{&font, pxSize, color, utf8};
|
||||
auto it = shapedRuns_.find(viewKey);
|
||||
if (it == shapedRuns_.end()) {
|
||||
// Miss: shape from scratch. Ensure() each glyph so brand-new ones
|
||||
// rasterise into the atlas and mark it dirty for the next upload —
|
||||
|
|
@ -110,6 +113,7 @@ std::uint32_t UIRenderer::ShapeText(Font& font, float pxSize,
|
|||
run.advance = cursor;
|
||||
|
||||
if (shapedRuns_.size() >= kMaxShapedRuns) shapedRuns_.clear();
|
||||
ShapedRunKey key{&font, pxSize, color, std::string(utf8)};
|
||||
it = shapedRuns_.emplace(std::move(key), std::move(run)).first;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue