# Perf Этап 2c — кеш line-of-sight (LoS) для AoE ## Что изменилось `map_foreachinshootrange` (фильтр «есть прямая видимость до цели») вызывал `path_search_long` на КАЖДОГО кандидата. Под WoE: `skill_unit_timer` каждые 100мс гоняет это для сотен AoE-клеток × по ~10-15 целей. Это самый тяжёлый кусок наземных AoE. **Ключевой факт:** `path_search_long` использует `CELL_CHKWALL`, а это **только статическая стена карты** (`type==1`). Ice Wall (`CELL_ICEWALL`) тут **НЕ учитывается** (проверка закомментирована в `map_getcellp`). Значит LoS между двумя клетками **зависит только от неизменяемой геометрии карты** и в рантайме не меняется. Поэтому LoS можно **мемоизировать навсегда, без инвалидации**. Добавлен `map_los_cached(m,x0,y0,x1,y1)` — direct-mapped кеш (64-битный проверяемый ключ `m:16,x0:12,y0:12,x1:12,y1:12`, ~1 МБ), которым заменены оба вызова `path_search_long` в `map_foreachinshootrange`. **Поведение идентично** (это мемоизация чистой функции). ## Флаг `conf/battle/skill.conf`: ``` skill_unit_los_cache: yes // yes (деф.) = кешировать LoS; no = считать каждый раз (старое) ``` `@reloadbattleconf` — A/B в одном бинарнике. ## Как замерить (главный WoE-этап) Под `UA_PERF=1`, плотная куча на GvG + AoE-спам (Storm Gust / LoV / Heaven's Drive / ловушки): 1. `skill_unit_los_cache: no` → профиль → доля `path_search_long` / `map_foreachinshootrange` / `skill_unit_timer`. 2. `skill_unit_los_cache: yes` → профиль. 3. Сравнить self% `path_search_long` — ожидается заметное падение (повторные LoS к стоящим целям берутся из кеша). Эффект максимален на стоячих кучах в чокпоинтах. ## Чек-лист корректности (важно — LoS влияет на попадания) - [ ] **Стена всё ещё блокирует AoE:** Storm Gust / Lord of Vermillion, скастованные у стены, НЕ бьют по другую сторону (как с `no`). Сравнить `yes` vs `no` — результат идентичен. - [ ] Ловушки/AoE срабатывают по целям в прямой видимости как раньше. - [ ] Снайп/ranged за стену не проходит (если где-то использует этот путь). - [ ] `yes` и `no` дают **одинаковый** игровой результат на любой карте (разница только в CPU). - [ ] Нет «пробивания» AoE сквозь статические стены после длительного аптайма (кеш не протухает — LoS статичен, это ожидаемо). ## Важная заметка Кеш не инвалидируется — это КОРРЕКТНО, т.к. LoS зависит только от статичных стен карты (грузятся при старте, в рантайме не меняются; Ice Wall на LoS не влияет). Если в будущем появится рантайм- изменение геометрии (например `@reloadmapcache` на живом сервере) — кеш нужно будет сбрасывать; сейчас такого пути нет. ## Откат `skill_unit_los_cache: no` + `@reloadbattleconf`. Сборка чистая, локальный буст кластера чистый.