From 68e7d17b149f6105cc90c5a88a63ac346be0452a Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 19 Aug 2026 16:57:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B5=D1=81=D1=82=D1=80:=20P16=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82,=20P14=20=D1=83=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D1=91=D0=BD=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=80?= =?UTF-8?q?=D0=BE=D0=BC=20=D1=82=D1=80=D1=83=D0=BF=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P16 (цианные проверки) — минус 25 818 тремя правками: снимок без построения структуры, guard_over_kid только когда кого-то рисуем, проверка слота без пяти аргументов. Записан и отрицательный результат внутри третьей: обёртка, которая внутри всё равно звала pop_cd_hit с пятью аргументами, сделала хуже. P14 уточнён: fore-проход не «62 778…89 000», а от 4 122 (персонаж пропущен) до 117 570 (труп Кида в челюстях — широкий кадр в тайле с передним слоем). Значит в бою он будет ближе к сотне тысяч. Бюджет лёгкой позиции: 801 768 -> 438 978. До цели 430 000 осталось 8 978 — одна правка. Co-Authored-By: Claude Opus 5 --- applications/PoP/docs/perf_registry.md | 60 +++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/applications/PoP/docs/perf_registry.md b/applications/PoP/docs/perf_registry.md index cc38624..aca2513 100644 --- a/applications/PoP/docs/perf_registry.md +++ b/applications/PoP/docs/perf_registry.md @@ -188,9 +188,55 @@ инициализация — пустая колонка обозначается `ymin = 255`, а нули от crt0 читались бы как «затронута строка 0». -### P14. Fore-проход персонажа — 62 778…89 000 НА ПЕРСОНАЖА [замер 2026-08-19] +### P16. Цианные проверки ✅ СДЕЛАНО 2026-08-19 — −25 818 -**Самая дорогая единичная статья кадра: около 152 000 на двоих, 20 % работы.** +Раскладка остатка цианной фазы (59 406) показала, что 47 883 из них — три +вызова, а не отрисовка: + +| вызов | было | стало | +|---|---:|---:| +| `pop_loose_mob_draw` | 978 | 978 (гейт `mobs_live` работает) | +| `guard_over_kid` | 14 424 | **0** | +| `pop_char_skip_mask` | 28 605 | ~21 000 | + +Три правки: + +1. **`cd_sig_same`** — сравнение снимка БЕЗ построения структуры. + `cd_sig_make` записывал тринадцать полей в стековый кадр (через + `-n(ix)`), и лишь потом шёл побайтовый цикл; теперь сравнение идёт прямо + с источником и выходит на первом расхождении. **−8 016**; +2. **`guard_over_kid` по условию** — вопрос «кто поверх кого» не имеет + смысла, когда не рисуется никто. Вызов перенесён ПОСЛЕ `skip_mask` и + идёт только при `skip != 3`. **−14 118**; +3. **`pop_cd_hit_slot`** — проверка «задет ли слот» брала пять аргументов, + три из них стеком (45 % тактов на IX). Теперь координаты берутся из + `pop_cd`, а сравнение вынесено в `hit_rect` с file-scope аргументами. + **−3 684**. + +**Отрицательный результат внутри третьей правки** (не повторять): первая +версия была обёрткой, которая внутри всё равно звала `pop_cd_hit` с пятью +аргументами — стало ХУЖЕ (1799 тактов Z80 вместо 1318). Снимать аргументы +со стека надо у того, кто их читает, а не этажом выше. + +### P14. Fore-проход персонажа — от 4 122 до 117 570 [замеры 2026-08-19] + +**Самая НЕСТАБИЛЬНАЯ статья кадра.** Замеры на одной и той же сцене: + +| ситуация | fore-проход | +|---|---:| +| персонаж пропущен (`skip`) | 4 122 | +| стоящий страж | 62 778 | +| живой Кид у чомпера | ~89 000 | +| **труп Кида в челюстях** | **117 570** | + +Растёт от двух вещей: ширины футпринта (широкий кадр смерти, вынутый меч +добавляет колонку) и числа тайлов с передним слоем внутри футпринта (здесь +чомпер со своими зубьями). Отсюда практический вывод: **в бою проход будет +ближе к сотне тысяч, чем к шестидесяти** — кадры выпадов и ударов широкие. + +Замер трупа сделан по просьбе пользователя. Сама по себе эта ситуация не +игровая («когда Кид — труп, игры нет»), но именно она показала верхнюю +границу цены. `pop_char_fore` = два трамплина в банк 2 (`pop_fore_set_clip` + `pop_fore_over_char`) плюс обход тайлов футпринта, в каждом `fore_tile`. @@ -387,6 +433,7 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за | # | что | факт | |---|---|---| | P15 | точность метки «фон трогали» + раздельная проверка клинка | **−163 746** лёгкая / **−140 871** тяжёлая | +| P16 | цианные проверки: снимок без структуры, `guard_over_kid` по условию, `hit_slot` без пяти аргументов | **−25 818** | | P5 | `loose_tick`: гейты холостого хода | **−33 840** (ждали −28 000) | | P1 | чомпер: перерисовка только при фазе < 6 | **−110 802** (ждали −160 000) | | P2b | луч видимости: колонки + один банковый вызов | **−26 448** (ждали −30 000) | @@ -400,7 +447,7 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за | # | что | ожидание | риск | комментарий | |---|---|---:|---|---| -| **P14** | **fore-проход персонажа** — 62 778 у стража, ~89 000 у Кида | **до −80 000** | высокий | самая дорогая статья кадра (20 %). Включает P10 как первый шаг | +| **P14** | **fore-проход персонажа** — 62 778 стоящий страж … **117 570** широкий кадр | **до −80 000** | высокий | самая нестабильная статья. Включает P10 как первый шаг | | P4 | накладные блита (4 правки) | −28 000 | низкий | 6 126 фиксированных на любой блит | | P11 | мелочи с известной ценой | −26 000 | низкий | `clip_char_top` 8 658 подтверждён замером | | P10 | футпринт персонажа из физики | −23 000 | средний | часть P14 | @@ -421,7 +468,8 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за | **после P2b (лёгкая позиция)** | **628 542** | 259 500 | 181 068 | 187 761 | 4 | | ТЯЖЁЛАЯ позиция (Кид на шаг правее) | 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 везде** | +| после P15, тяжёлая | 617 487 | 245 808 | 181 761 | 192 090 | **4 везде** | +| **после P16, лёгкая** | **438 978** | 218 052 | 181 494 | **39 438** | 4 | Итог восьми позиций: **801 768 → 464 796 в лёгкой позиции (−42 %)** и **758 358 → 617 487 в тяжёлой (−19 %)**. Отдельно важно: в тяжёлой позиции @@ -432,8 +480,8 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за Цель: работа ≤ 430 000, тогда период станет 3 растра (хвост кадра — три `gfx_wait_vsync`). -- в ЛЁГКОЙ позиции снять надо **35 000** (после P15 — рукой подать); -- в ТЯЖЁЛОЙ — **187 000**. +- в ЛЁГКОЙ позиции снять надо **8 978** — одна правка; +- в ТЯЖЁЛОЙ — около **187 000** (замер после P16 не повторялся). Всё оставшееся в списке, кроме P13, даёт по оценкам **порядка 100 000** — и это оптимистично. **Арифметика не сходится:** сцена с двумя персонажами,