perf(runtime): remove measured steady allocations

Eliminate boxed production surface-override enumeration, retain vital modifier projections until the enchantment registry mutates, and measure DAT font widths without allocating a captured delegate. Preserve exact hashes, spell stacking, and glyph advances with warmed zero-allocation tests.

Validated by the focused rendering, UI, and spell suites, a zero-error Release build, and 8,409 passing Release tests with five pre-existing skips.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-25 17:50:30 +02:00
parent 574a6c454f
commit feb80a67d9
6 changed files with 188 additions and 14 deletions

View file

@ -848,18 +848,33 @@ internal sealed class CurrentRenderSceneOracle :
ulong xorHigh = 0;
ulong sumLow = 0;
ulong sumHigh = 0;
foreach ((uint surfaceId, uint replacementId) in overrides)
if (overrides is Dictionary<uint, uint> dictionary)
{
StableRenderHash128 pair = StableRenderHash128.Create();
pair.Add(surfaceId);
pair.Add(replacementId);
RenderSceneHash128 value = pair.Finish();
xorLow ^= value.Low;
xorHigh ^= value.High;
unchecked
// Production hydration owns Dictionary instances. Enumerating
// through IReadOnlyDictionary boxes Dictionary.Enumerator for
// every live mesh on both projection-sync phases.
foreach (KeyValuePair<uint, uint> pair in dictionary)
{
sumLow += value.Low;
sumHigh += value.High;
Accumulate(
pair.Key,
pair.Value,
ref xorLow,
ref xorHigh,
ref sumLow,
ref sumHigh);
}
}
else
{
foreach ((uint surfaceId, uint replacementId) in overrides)
{
Accumulate(
surfaceId,
replacementId,
ref xorLow,
ref xorHigh,
ref sumLow,
ref sumHigh);
}
}
@ -870,6 +885,27 @@ internal sealed class CurrentRenderSceneOracle :
geometry.Add(sumLow);
geometry.Add(sumHigh);
return geometry.Finish();
static void Accumulate(
uint surfaceId,
uint replacementId,
ref ulong xorLow,
ref ulong xorHigh,
ref ulong sumLow,
ref ulong sumHigh)
{
StableRenderHash128 pairHash = StableRenderHash128.Create();
pairHash.Add(surfaceId);
pairHash.Add(replacementId);
RenderSceneHash128 value = pairHash.Finish();
xorLow ^= value.Low;
xorHigh ^= value.High;
unchecked
{
sumLow += value.Low;
sumHigh += value.High;
}
}
}
internal static RenderSceneHash128 FingerprintSelectionGeometry(

View file

@ -62,7 +62,7 @@ public sealed class UiDatFont
private readonly Dictionary<char, FontCharDesc> _glyphs;
private UiDatFont(
internal UiDatFont(
uint fgTex, int fgW, int fgH,
uint bgTex, int bgW, int bgH,
float lineHeight, float baselineOffset,
@ -131,7 +131,18 @@ public sealed class UiDatFont
/// glyph's retail advance. Characters not in the font contribute nothing.
/// </summary>
public float MeasureWidth(string text)
=> MeasureWidth(text, c => _glyphs.TryGetValue(c, out var g) ? g : null);
{
if (string.IsNullOrEmpty(text)) return 0f;
float width = 0f;
for (int index = 0; index < text.Length; index++)
{
if (_glyphs.TryGetValue(text[index], out FontCharDesc? glyph))
width += GlyphAdvance(glyph);
}
return width;
}
/// <summary>
/// Pure pen-advance summation seam: total width of <paramref name="text"/>

View file

@ -23,6 +23,7 @@ public sealed class Spellbook
private readonly Dictionary<uint, float> _learnedSpells = new();
private readonly Dictionary<uint, ActiveEnchantmentRecord> _activeById = new();
private readonly Dictionary<uint, List<uint>> _enchantmentOrderByBucket = new();
private readonly Dictionary<uint, EnchantmentMath.VitalMod> _vitalModCache = new();
private readonly List<uint>[] _favoriteSpells = Enumerable.Range(0, 8)
.Select(_ => new List<uint>()).ToArray();
private readonly Dictionary<uint, uint> _desiredComponents = new();
@ -86,8 +87,20 @@ public sealed class Spellbook
/// <see cref="EnchantmentMath.VitalMod.Identity"/> when no buffs
/// apply (or when no SpellTable was wired).
/// </summary>
public EnchantmentMath.VitalMod GetVitalMod(uint statKey) =>
EnchantmentMath.GetMod(ActiveEnchantments, _table, statKey);
public EnchantmentMath.VitalMod GetVitalMod(uint statKey)
{
if (_vitalModCache.TryGetValue(
statKey,
out EnchantmentMath.VitalMod cached))
{
return cached;
}
EnchantmentMath.VitalMod calculated =
EnchantmentMath.GetMod(ActiveEnchantments, _table, statKey);
_vitalModCache.Add(statKey, calculated);
return calculated;
}
/// <summary>Fires when a spell is added to the player's spellbook.</summary>
public event Action<uint>? SpellLearned;
@ -342,6 +355,7 @@ public sealed class Spellbook
_activeById.Clear();
_enchantmentOrderByBucket.Clear();
_vitalModCache.Clear();
foreach (ActiveEnchantmentRecord enchantment in enchantments)
UpsertManifestEnchantment(enchantment);
@ -401,6 +415,7 @@ public sealed class Spellbook
_learnedSpells.Clear();
_activeById.Clear();
_enchantmentOrderByBucket.Clear();
_vitalModCache.Clear();
foreach (List<uint> tab in _favoriteSpells) tab.Clear();
_desiredComponents.Clear();
_spellbookFilters = 0x3FFFu;
@ -418,6 +433,7 @@ public sealed class Spellbook
private void NotifyEnchantmentsChanged()
{
_vitalModCache.Clear();
EnchantmentsChanged?.Invoke();
StateChanged?.Invoke();
}