Stable radix sprite sort and render hot-path optimizations
SpriteBatcher now sorts with a stable LSD radix sort: equal-key sprites keep submission order across frames (no flicker) and passes over digits identical in all keys are skipped, making the common single-layer case nearly free. Hot paths avoid per-sprite trig and square roots: SinCos is skipped for unrotated sprites and the culling radius comes from the region's precomputed diagonal. Stress scene (100k entities, ~61k on screen, Release): 103 -> 124 FPS. Sample now runs with VSync off to show real frame rates. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
2b7d4c4fef
commit
a3e6d3bb0a
@@ -132,11 +132,18 @@ public static partial class GameAssets
|
||||
- Порядок сортировки: **слой → depth (или Y) → текстура**; спрайты с одной
|
||||
текстурой сливаются в один draw call (динамический vertex buffer + общий
|
||||
quad index buffer).
|
||||
- Сортировка — **стабильный LSD radix sort**: спрайты с равным ключом сохраняют
|
||||
порядок сабмита между кадрами (нет мерцания), сложность O(n); проходы по
|
||||
одинаковым у всех ключей разрядам пропускаются.
|
||||
- Горячий путь без тригонометрии и корней: для спрайтов без поворота SinCos
|
||||
не вычисляется, радиус culling-окружности берётся из предрассчитанной
|
||||
диагонали региона.
|
||||
- Текстурные атласы — первоклассный гражданин: `Sprite` хранит регион атласа,
|
||||
спрайты одного атласа батчатся автоматически.
|
||||
- Цель по производительности: ≥100k спрайтов при 60 FPS на среднем десктопе,
|
||||
0 аллокаций на кадр. Контролируется бенчмарками (BenchmarkDotNet) и
|
||||
стресс-сценой в Sample.
|
||||
0 аллокаций на кадр. Контролируется стресс-сценой в Sample: 100k сущностей
|
||||
(~61k в кадре) ≈ 124 FPS в Release. **Производительность измеряется только
|
||||
в Release** — Debug-сборка медленнее в 5–6 раз (нет инлайнинга JIT).
|
||||
|
||||
## Сцены и переходы
|
||||
|
||||
|
||||
Reference in New Issue
Block a user