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 ввод):** | блок | тактов | % растрового кадра |