diff --git a/applications/PoP/docs/perf_l11_room15.md b/applications/PoP/docs/perf_l11_room15.md index d6c12ee..062a3db 100644 --- a/applications/PoP/docs/perf_l11_room15.md +++ b/applications/PoP/docs/perf_l11_room15.md @@ -217,6 +217,22 @@ fore-проход персонажа.** 62 778 у стража и ~89 000 у К (`POP_CHOMP_FRAM_FOR`), который перерисовывается поверх персонажа каждый кадр. +## 8. После P15 (точная метка «фон трогали») + +| фаза | лёгкая до | лёгкая после | тяжёлая до | тяжёлая после | +|---|---:|---:|---:|---:| +| синяя | 259 050 | **223 902** | 257 520 | **245 808** | +| зелёная | 181 494 | 181 494 | 180 870 | 181 761 | +| циан | 194 262 | **59 406** | 319 842 | **192 090** | +| **работа** | 628 542 | **464 796** | 758 358 | **617 487** | + +В лёгкой позиции не рисуется НИ ОДИН персонаж (циан 59 406 — это уже только +`check_mirror`, проверки и передний слой по пометкам). В тяжёлой рисуется +один Кид: он действительно стоит под пламенем, а страж — нет. + +**Пятирастровые кадры в тяжёлой позиции исчезли** (было 27 %), период стал +ровно 4. + **Полная очередь оптимизаций с оценками — [`perf_registry.md`](perf_registry.md).** Там же разложена цена одного блита фона по этапам (замер 2026-08-19, 1603 блита) и модель зелёной фазы этой сцены. diff --git a/applications/PoP/docs/perf_registry.md b/applications/PoP/docs/perf_registry.md index d76d7f4..cc38624 100644 --- a/applications/PoP/docs/perf_registry.md +++ b/applications/PoP/docs/perf_registry.md @@ -150,34 +150,43 @@ Новое, найдено 2026-08-19. -### P15. Метка «фон трогали» слишком груба — ОБЯЗАТЕЛЬНО [замер 2026-08-19] +### P15. Точность метки «фон трогали» ✅ СДЕЛАНО 2026-08-19 — −163 746 / −140 871 -**Постановка пользователя:** проверять, нужна ли отрисовка стража, когда он -не двигается. Если движется — лишние ~150 000 приемлемы (в оригинале при -бое число физических кадров на логический тоже растёт на единицу). +Постановка пользователя: не перерисовывать стража, пока он не двигается. -| объект | x | y | -|---|---|---| -| страж, спрайт | 257..284 | 18..56 | -| страж, клинок | 241..261 | 31..37 | -| пламя факела (колонка 6 → ячейка 7) | 232..247 | 5..22 | +**Две правки, и вторая оказалась решающей:** -**Физического перекрытия нет:** по x клинок и пламя пересекаются, по y между -ними девять пикселей зазора. Стража будит гранулярность метки — -`pop_cd_touch` хранит маску колонок по 32 px на ТРИ ряда по 63 px, и пламя с -клинком слипаются в одном ряду. Цена ложной тревоги — **148 302 такта, -23 % кадра**. +1. **метка**: вместо «маска колонок × три ряда по 63 px» — диапазон y на + каждую колонку (`ymin`/`ymax`, 40 байт на обе страницы). Прежняя + гранулярность склеивала пламя факела (y 33..50) с клинком стоящего + стража (y 59..65), между которыми девять пикселей зазора; +2. **проверка**: `cd_quiet` сверяет спрайт и накладной (клинок, брызги) + ДВУМЯ отдельными прямоугольниками вместо объединённого bbox. + Объединение включает пустой угол: спрайт стража в колонке 8, клинок + уходит в колонку 7 на y 59..65, пламя метит колонку 7 на y 33..50 — + и прямоугольник «спрайт + клинок» цеплял метку углом. -Решение: хранить на колонку диапазон y вместо номера ряда (10 × 2 байта × 2 -страницы = 40 байт). Проверено расчётом, что это спасает стража и НЕ -спасает Кида в тяжёлой позиции — там перекрытие настоящее. +**Без второй правки первая дала почти ноль** (632 676 против 628 542 до +неё) — это стоит помнить: точность структуры бесполезна, пока запрос к ней +остаётся грубым. -**Осторожно с историей вопроса:** первая редакция этой позиции утверждала, -что перекрытие реальное (16 × 5 пикселей на макушке) и предлагала частичную -перерисовку. Это была ошибка — координаты пламени взяты по предположению -«факел в колонке 7» без проверки, а пользователь увидел на экране, что -страж целиком правее пламени. Полная постановка — `TASKS_OPEN.md`, якорь -`char-partial-redraw`. +| | лёгкая позиция | тяжёлая позиция | +|---|---:|---:| +| синяя | 259 050 → **223 902** | 257 520 → **245 808** | +| зелёная | 181 494 → 181 494 | 180 870 → 181 761 | +| циан | 194 262 → **59 406** | 319 842 → **192 090** | +| **работа** | 628 542 → **464 796** | 758 358 → **617 487** | + +В тяжёлой позиции вдобавок исчезли пятирастровые кадры (было 27 %). + +Проверено в MAME: статика чистая, динамика (пробежка, бой, переход в +соседнюю комнату) без хвостов и просвечивания; хост-тесты зелёные. + +Побочно исправлены два собственных дефекта первой редакции: обе страницы +обновлялись по условию, проверяющему только страницу 0 (после +`pop_cd_clear(0)` метка второй переставала расти), и отсутствовала явная +инициализация — пустая колонка обозначается `ymin = 255`, а нули от crt0 +читались бы как «затронута строка 0». ### P14. Fore-проход персонажа — 62 778…89 000 НА ПЕРСОНАЖА [замер 2026-08-19] @@ -377,6 +386,7 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за | # | что | факт | |---|---|---| +| P15 | точность метки «фон трогали» + раздельная проверка клинка | **−163 746** лёгкая / **−140 871** тяжёлая | | P5 | `loose_tick`: гейты холостого хода | **−33 840** (ждали −28 000) | | P1 | чомпер: перерисовка только при фазе < 6 | **−110 802** (ждали −160 000) | | P2b | луч видимости: колонки + один банковый вызов | **−26 448** (ждали −30 000) | @@ -389,7 +399,7 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за | # | что | ожидание | риск | комментарий | |---|---|---:|---|---| -| **P15** | **точность метки «фон трогали»: диапазон y на колонку** | **−148 302** | низкий | **ОБЯЗАТЕЛЬНАЯ** (пользователь, 2026-08-19). Перекрытия НЕТ, ложная тревога из-за рядов по 63 px | + | **P14** | **fore-проход персонажа** — 62 778 у стража, ~89 000 у Кида | **до −80 000** | высокий | самая дорогая статья кадра (20 %). Включает P10 как первый шаг | | P4 | накладные блита (4 правки) | −28 000 | низкий | 6 126 фиксированных на любой блит | | P11 | мелочи с известной ценой | −26 000 | низкий | `clip_char_top` 8 658 подтверждён замером | @@ -409,17 +419,21 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за | после P1 (медиана) | 657 882 | 286 503 | 183 420 | 187 761 | 4 | | после P2a | 654 990 | 283 215 | 183 798 | 187 812 | 4 | | **после P2b (лёгкая позиция)** | **628 542** | 259 500 | 181 068 | 187 761 | 4 | -| **ТЯЖЁЛАЯ позиция (Кид на шаг правее)** | **758 358** | 257 520 | 180 870 | **319 842** | **4 и 5** | +| ТЯЖЁЛАЯ позиция (Кид на шаг правее) | 758 358 | 257 520 | 180 870 | 319 842 | **4 и 5** | +| **после P15, лёгкая** | **464 796** | 223 902 | 181 494 | **59 406** | 4 | +| **после P15, тяжёлая** | **617 487** | 245 808 | 181 761 | 192 090 | **4 везде** | -Итог семи позиций: **801 768 → 628 542, то есть −22 %**. +Итог восьми позиций: **801 768 → 464 796 в лёгкой позиции (−42 %)** и +**758 358 → 617 487 в тяжёлой (−19 %)**. Отдельно важно: в тяжёлой позиции +исчезли пятирастровые кадры (было 27 %), период стал ровно 4 — рывки ушли. ### Достижима ли цель — арифметика на 2026-08-19 Цель: работа ≤ 430 000, тогда период станет 3 растра (хвост кадра — три `gfx_wait_vsync`). -- в ЛЁГКОЙ позиции снять надо **199 000**; -- в ТЯЖЁЛОЙ — **328 000**, и там уже 27 % кадров идут по 5 растров. +- в ЛЁГКОЙ позиции снять надо **35 000** (после P15 — рукой подать); +- в ТЯЖЁЛОЙ — **187 000**. Всё оставшееся в списке, кроме P13, даёт по оценкам **порядка 100 000** — и это оптимистично. **Арифметика не сходится:** сцена с двумя персонажами,