From e261a35acb1d3bb37d3d9961fb3526ade12cd2b5 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Mon, 10 Aug 2026 21:02:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D1=80=20=D0=B2=20MAME:?= =?UTF-8?q?=20A/B=20=D1=81=D0=BE=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=B4=D0=BE=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D0=BA,?= =?UTF-8?q?=20=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D0=B3?= =?UTF-8?q?=D0=BE=D1=80=D1=8F=D1=87=D0=B5=D0=BC=20=D0=BF=D1=83=D1=82=D0=B8?= =?UTF-8?q?=20=3D=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обе сборки прогнаны полным циклом (make hdd -> рестарт MAME -> уровень 1), сцена «комната 1, Кид стоит, соперника нет», скриншоты идентичны. Фазы сняты брейкпоинтами на out (_io_border), a, медиана по 60 кадрам: спрайты 129 568 -> 127 510 (-2 058) работа/кадр 391 258 -> 389 221 (-2 037) остальные фазы совпали такт в такт Счётчик делений (bp на __divsint/__modsint/__divuchar/__moduchar с печатью адреса возврата): комната 1, только Кид : 1,00 __divsint/кадр (возврат 0xD3AA = pop_cdraw) -> 0 комната 3, бой стража : 2,01 __divsint/кадр -> 0 Экономия ровно в фазе спрайтов и ровно на стоимость одного вызова (2 058 тактов против документированной оценки ~2 400). Честные оговорки записаны в TASKS_OPEN: период цикла как был 3 растровых кадра, так и остался (выигрыш ушёл в запас, 40 800 вместо 38 700); остальные правки в этой сцене не срабатывают; тайминги комнаты 3 несравнимы между прогонами (живой страж + pop_char_skip_mask), оттуда взят только счётчик делений. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/TASKS_OPEN.md | 42 +++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/applications/PoP/roomtest/TASKS_OPEN.md b/applications/PoP/roomtest/TASKS_OPEN.md index 967b047..6409b65 100644 --- a/applications/PoP/roomtest/TASKS_OPEN.md +++ b/applications/PoP/roomtest/TASKS_OPEN.md @@ -517,6 +517,48 @@ awk '/^;[a-z_0-9]+\.[ch]:[0-9]+:/{s=$0} /^\tcall\t__(div|mod|mul)/{printf "%-22s Итог: **в горячем пути делений не осталось**. В банках 4, 6, 7 — ноль `__div*`; всё, что видно в списке выше, либо за быстрым путём, либо холодное. +### Замер в MAME: A/B со сборкой `ec3cca5` (до правок) + +Обе сборки прогнаны через полный цикл (`make hdd` → рестарт MAME → загрузка +уровня 1), сцена — **комната 1, Кид стоит, соперника нет**; скриншоты обеих +сборок идентичны. Фазы сняты брейкпоинтами на инструкциях `out +(_io_border), a` профилировочного бордюра, медиана по 60 логическим кадрам: + +| фаза | до | после | Δ | +|---|---|---|---| +| ввод + heal | 62 361 | 62 364 | +3 | +| логика | 79 878 | 79 878 | 0 | +| фон | 119 502 | 119 502 | 0 | +| **спрайты** | **129 568** | **127 510** | **−2 058** | +| РАБОТА за кадр | 391 258 | 389 221 | −2 037 | + +Счётчик делений (брейкпоинты на `__divsint`/`__modsint`/`__divuchar`/ +`__moduchar` с печатью адреса возврата): + +| сцена | до | после | +|---|---|---| +| комната 1, только Кид | **1,00 `__divsint`/кадр** (возврат 0xD3AA = `pop_cdraw`) | **0** | +| комната 3, бой со стражем | **2,01 `__divsint`/кадр** | **0** (82 кадра боя) | + +Всё сходится в одну картину: единственное деление горячего пути — `×8/7` на +персонажа, по одному вызову на каждого Char. Экономия ровно в фазе спрайтов +и ровно на стоимость одного вызова: **2 058 тактов** (документированная +оценка была ~2 400). С соперником на сцене — вдвое. + +**Чего этот замер НЕ показывает, и это важно:** + +- Период цикла как был 3 растровых кадра, так и остался — 2 000 тактов его не + двигают. Выигрыш ушёл в запас: до нижней границы 430 000 стало 40 800 + тактов вместо 38 700. +- Остальные правки (три `y_to_row` в `pop_room`, `guard_col_from_x`, + `tp/10` у чомпера) в этой сцене **не срабатывают вовсе** — им нужны + падающая плита, переход стража между комнатами и уровень с чомперами. + Их стоимость известна поштучно, но в бою я их не ловил. +- Работа в комнате 3 между прогонами **несравнима** (391 204 против 318 145): + страж живой, фаза боя и срабатывание `pop_char_skip_mask` от прогона к + прогону разные. Оттуда взят только СЧЁТЧИК делений — он от таймингов не + зависит. + **Профиль работы за логический кадр СЕЙЧАС (409 956 тактов + ~15 600 ввод):** | блок | тактов | % растрового кадра |