perf(render): culling тайлов карты, пустые оверлеи света, setDepth без пересортировки
О-2 рендера. На лугах ~900+ спрайтов карты рисовались целиком при ~250
видимых; пустые fullscreen-оверлеи света (ambient/vignette/пульс) рисовались
каждый кадр даже днём; ходьба взводила sortDirty каждый тик.

- IsometricTileMap.cullToRect: тайловое окно из экранных углов (screenToIso),
  margin ±1 по X и вверх на высоту самого высокого tall; пересчёт только при
  сдвиге окна; isTileVisible — для тестов/отладки; вызов из сцены
  (updateCameraFollow). null — вернуть всё.
- Lighting: ambient.visible=false при белом тинте, vignette/pulseAmb — при
  нулевой альфе (днём минус 2-3 fullscreen-квада).
- IsoDepthLayer.setDepth/setDepthRect: ранний выход при неизменном zIndex
  (пиксельная сортировка детей не перезапускается каждый тик ходьбы).
- agent.mjs perf: возврат 0 (объект отчёта ломал process.exit).

Perf (swiftshader headless, до → после): fps бой 3-6 → 7-8, покой 5-6 → 5-7
(rasterizer swiftshader глушит выигрыш — он раскроется на целевом iGPU);
heap в пределах шума (28-31 МБ). Скриншот смоука не изменился, тайлы у краёв
камеры на месте.

Co-Authored-By: Claude Code <noreply@anthropic.com>
1 parent 255c635 commit 202599e46cc37a57411b418c8d2252de38ec874a
@root root authored 7 hours ago
Showing 7 changed files
View
apps/game/src/scenes/LocationScene.ts
View
apps/game/tools/agent.mjs
View
docs/engine/maps.md
View
packages/engine/src/map/IsometricTileMap.ts
View
packages/engine/src/map/__tests__/isometricMap.test.ts
View
packages/engine/src/render/IsoDepthLayer.ts
View
packages/engine/src/render/Lighting.ts