Parallel rendering pipeline, ring vertex buffer, phase timings
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>
This commit is contained in:
co-authored by
Claude Fable 5
parent
af319d1276
commit
e06f24a319
+16
-5
@@ -151,14 +151,25 @@ public static partial class GameAssets
|
||||
- Сортировка — **стабильный LSD radix sort**: спрайты с равным ключом сохраняют
|
||||
порядок сабмита между кадрами (нет мерцания), сложность O(n); проходы по
|
||||
одинаковым у всех ключей разрядам пропускаются.
|
||||
- Горячий путь без тригонометрии и корней: для спрайтов без поворота SinCos
|
||||
не вычисляется, радиус culling-окружности берётся из предрассчитанной
|
||||
диагонали региона.
|
||||
- Горячий путь без тригонометрии, корней и делений: для спрайтов без поворота
|
||||
SinCos не вычисляется; радиус culling-окружности и UV-координаты
|
||||
предрассчитаны в `Texture2DRegion`.
|
||||
- **Параллелизм**: выше `Renderer2DOptions.ParallelThreshold` (по умолчанию 8192)
|
||||
подача спрайтов и построение вершин идут на всех ядрах. Работа режется на
|
||||
сегменты по 4096 сущностей (чанк Friflo держит весь архетип — сам по себе он
|
||||
слишком крупный для распределения); сегменты сливаются в детерминированном
|
||||
порядке, поэтому стабильность сортировки сохраняется. Ниже порога — прежний
|
||||
однопоточный путь без аллокаций.
|
||||
- Vertex buffer пишется **кольцом** (`SetDataOptions.NoOverwrite`, GPU-буфер
|
||||
вдвое больше кадра): загрузка не ждёт, пока GPU дорисует предыдущий кадр;
|
||||
`Discard` — только на перемотке кольца.
|
||||
- **Тайминги фаз** кадра (submit/sort/build/upload/draw, мс) доступны как свойства
|
||||
`Renderer2D` — выводятся в HUD стресс-сцены; оптимизации делаются только по ним.
|
||||
- Текстурные атласы — первоклассный гражданин: `Sprite` хранит регион атласа,
|
||||
спрайты одного атласа батчатся автоматически.
|
||||
- Цель по производительности: ≥100k спрайтов при 60 FPS на среднем десктопе,
|
||||
0 аллокаций на кадр. Контролируется стресс-сценой в Sample: 100k сущностей
|
||||
(~61k в кадре) ≈ 124 FPS в Release. **Производительность измеряется только
|
||||
0 аллокаций на кадр ниже порога параллелизма. Стресс-сцена Sample: 100k сущностей
|
||||
(~61k в кадре) ≈ 297 FPS в Release. **Производительность измеряется только
|
||||
в Release** — Debug-сборка медленнее в 5–6 раз (нет инлайнинга JIT).
|
||||
|
||||
## Сцены и переходы
|
||||
|
||||
Reference in New Issue
Block a user