Реестр: P15 закрыт замерами обеих позиций

Лёгкая: 628 542 -> 464 796 (-163 746), персонажи не рисуются вовсе.
Тяжёлая: 758 358 -> 617 487 (-140 871), рисуется только Кид — он
действительно стоит под пламенем, а страж нет.  Пятирастровые кадры в
тяжёлой позиции исчезли (было 27 %).

Итог восьми позиций: 801 768 -> 464 796 в лёгкой (-42 %).  До цели
430 000 осталось 35 000 в лёгкой и 187 000 в тяжёлой.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 16:09:47 +03:00
parent 767d6f78a4
commit 41deb69013
2 changed files with 58 additions and 28 deletions
+16
View File
@@ -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
блита) и модель зелёной фазы этой сцены.
+42 -28
View File
@@ -150,34 +150,43 @@
Новое, найдено 2026-08-19.
### P15. Метка «фон трогали» слишком груба — ОБЯЗАТЕЛЬНО [замер 2026-08-19]
### P15. Точность метки «фон трогали» ✅ СДЕЛАНО 2026-08-19163 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** — и
это оптимистично. **Арифметика не сходится:** сцена с двумя персонажами,