Замер в MAME: A/B со сборкой до правок, деления в горячем пути = 0
Обе сборки прогнаны полным циклом (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 <noreply@anthropic.com>
This commit is contained in:
@@ -517,6 +517,48 @@ awk '/^;[a-z_0-9]+\.[ch]:[0-9]+:/{s=$0} /^\tcall\t__(div|mod|mul)/{printf "%-22s
|
|||||||
Итог: **в горячем пути делений не осталось**. В банках 4, 6, 7 — ноль
|
Итог: **в горячем пути делений не осталось**. В банках 4, 6, 7 — ноль
|
||||||
`__div*`; всё, что видно в списке выше, либо за быстрым путём, либо холодное.
|
`__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 ввод):**
|
**Профиль работы за логический кадр СЕЙЧАС (409 956 тактов + ~15 600 ввод):**
|
||||||
|
|
||||||
| блок | тактов | % растрового кадра |
|
| блок | тактов | % растрового кадра |
|
||||||
|
|||||||
Reference in New Issue
Block a user