Lab · потрогать руками
Где живут твои данные
Лаба без кода: одна и та же система-проход читает
Position+Velocity у N сущностей. Меняешь только раскладку памяти — и смотришь, сколько строк кэша реально тянется из RAM и во сколько раз это быстрее или медленнее. Всё, что в уроке посчитано формулой, тут видно глазами.Как пользоваться
Выбери раскладку: SoA (структура массивов — компоненты колонками), AoS (массив структур — «жирный» объект, система читает 16 из его байт) или OOP-куча (объекты разбросаны, доступ по указателям). Крути N (число сущностей) и размер структуры у AoS. Жми Прогон системы — каждый квадрат это строка кэша 64 Б, которую пришлось подтянуть; зелёное в ней — байты, которые система реально использует, оранжевое — притащено зря. Сравни три раскладки в таблице снизу: та же работа, та же O(N) — разница только в движении данных.
полезные байты (Pos+Vel)
притащено зря
промах (столл RAM)
ещё не тронуто
| раскладка | строк кэша | полезно | время (×) |
|---|
Что заметить: 1) SoA тянет минимум строк, ~100% байт полезны — система течёт линейно, префетчер прячет латентность. 2) AoS: подними «размер структуры» — система всё так же читает только 16 байт, но тащит весь жирный объект → оранжевого всё больше, строк больше, время растёт пропорционально мусору (на 64 Б — ровно 4×). Поставь размер 16 — AoS догоняет SoA (структура = ровно нужные поля). 3) OOP-куча: те же данные, но каждый объект в случайном адресе → красные промахи, префетч бессилен, на проход уходит на порядок-два больше. Та же сложность O(N) — раскладка решает.
🏠 Что дальше
Вернись в урок, блок «🔧 Запусти и поковыряй» — там как собрать mini-archetype-ECS на Rust (~300 строк) и снять реальные cache-misses через Tracy: увидеть на своём железе, что число промахов падает, а не просто «стало чуть быстрее».
Связи
из урока
ECS и data-oriented design — теория: memory wall, cost-model прохода
time ≈ N·(t_hit + m_miss·t_miss), archetype vs sparse-set.пересечение
Pathfinding — flow field: один расчёт на всех вместо тысяч независимых поисков — та же дисциплина раскладки под горячий цикл.
Что заметить по итогу (чеклист наблюдений)
- Сравнил строки кэша: SoA ≪ OOP при той же полезной работе.
- Покрутил размер структуры у AoS: util падает с ~100% до 25%, время растёт во столько же раз.
- Поставил размер структуры = 16 и увидел, что AoS сравнялся с SoA.
- В OOP-куче увидел красные промахи: префетч не работает на случайных адресах.