Five optimizations measured on the 100k-entity stress scene (Release,
vsync off): 103 FPS baseline -> 297 FPS.
- Sprite submission and vertex building run on all cores above
Renderer2DOptions.ParallelThreshold (default 8192). Work is sliced
into 4096-entity segments: a Friflo chunk holds a whole archetype,
so per-chunk parallelism degenerates to one thread. Segments merge
in deterministic order, preserving radix sort stability.
- Vertex buffer is ring-written with SetDataOptions.NoOverwrite
(GPU buffer 2x frame size); Discard only on wrap-around.
- Texture2DRegion precomputes UVs - four float divisions per sprite
per frame removed.
- Renderer2D exposes per-phase timings (submit/sort/build/upload/draw),
shown in the sample HUD - all further optimization is data-driven.
- Sample BounceSystem parallelized the same segmented way.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
scene.UseUI() creates a per-scene Myra Desktop and registers
UiRenderSystem last in the draw phase (UI on top, window pixels).
GameHost now exposes itself as a Game service (Myra needs the instance;
useful for games too). Myra was picked over Gum/ImGui for the
FontStashSharp ecosystem fit, pipeline-free assets and maturity; its
internal SpriteBatch use is a documented exception to the engine rule.
Sample: on-screen HUD replaces window-title-only stats — live FPS label,
music volume slider and scene-switch buttons on both scenes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>