Реестр: 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:
@@ -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
|
||||
блита) и модель зелёной фазы этой сцены.
|
||||
|
||||
@@ -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** — и
|
||||
это оптимистично. **Арифметика не сходится:** сцена с двумя персонажами,
|
||||
|
||||
Reference in New Issue
Block a user