diff --git a/applications/PoP/docs/perf_registry.md b/applications/PoP/docs/perf_registry.md index 801a0a6..9ecaa55 100644 --- a/applications/PoP/docs/perf_registry.md +++ b/applications/PoP/docs/perf_registry.md @@ -304,8 +304,8 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за | P6 | замер `process_trobs` | ✅ замерено 2026-08-19 | 11 058 префетч + ~43 000 цикл | | P1 | чомпер: перерисовка только при фазе < 6 | ✅ **сделано** 2026-08-19 | −110 802 (ждали −160 000) | | P2a | `coll_scan` в 8 бит + снят с IX | ✅ **сделано** 2026-08-19 | −3 486 в коллизиях, −2 892 на кадре | -| P2b | гейт луча видимости стража | ⬜ **следующее** | ждём −30 000, риск низкий | -| P4 | накладные блита (4 правки) | ⬜ | ждём −28 000 | +| P2b | луч видимости: колонки + один банковый вызов | ✅ **сделано** 2026-08-19 | −26 448 (ждали −30 000) | +| P4 | накладные блита (4 правки) | ⬜ **следующее** | ждём −28 000 | | P11 | мелочи с известной ценой | ⬜ | ждём −26 000 | | P10 | футпринт персонажа из физики | ⬜ | ждём −23 000 | | P6a/P6b | `trob_modif` из цикла, кэш префетча | ⬜ | ждём −20 000 | @@ -347,7 +347,8 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за | после P5 | 767 928 | 285 864 | 294 384 | 187 764 | 4 растра | | после P1 (медиана) | **657 882** | 286 503 | 183 420 | 187 761 | 4 растра | | после P1 (дорогой кадр, 40 %) | 765 936 | 286 503 | 291 888 | 187 761 | 4 растра | -| после P2a (медиана) | **654 990** | 283 215 | 183 798 | 187 812 | 4 растра | +| после P2a (медиана) | 654 990 | 283 215 | 183 798 | 187 812 | 4 растра | +| после P2b (медиана) | **628 542** | 259 500 | 181 068 | 187 761 | 4 растра | Цель — уложить РАБОТУ в 430 000 (тогда период станет 3 растра вместо 4; хвост кадра — три `gfx_wait_vsync`). Осталось снять **228 000** с медианы @@ -401,3 +402,46 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за сцена ушла с 1,86 растрового кадра до ~1,2 — но НЕ хватит, чтобы период кадра упал с 4 растров до 3: для этого работа должна уложиться в 430 000, то есть нужны ещё ~90 000 сверху (P2 или P6). + +--- + +## 6. Иерархия референсов (уточнена 2026-08-19) + +Сравнение трёх реализаций луча видимости показало, что источники не +равноценны, и это важно для ЛЮБОЙ будущей оптимизации: + +| источник | что берём | чего НЕ берём | +|---|---|---| +| **Apple II** (`Prince-of-Persia-Apple-II`) | как это делается на 8 битах: таблицы вместо делений, борьба за такты | ничего — но код на 6502, читать сложнее | +| **SDLPoP** | эталон ПОВЕДЕНИЯ (декомпиляция DOS-версии) | реализацию: она нарочно «расслаблена» под 32 бита | +| **mininim** | разбор краевых случаев, второе мнение о замысле | алгоритмы — переписан с нуля, механика местами своя | + +Доказательство на конкретном месте: `get_tile_div_mod` в SDLPoP содержит +комментарий + +```c +// DOS PoP does this: +// obj_xl = tile_mod_tbl[xpos]; +// return tile_div_tbl[xpos]; +``` + +а вместо этого делает `x % TILE_SIZEX` и `x / TILE_SIZEX`. Таблицы в файле +лежат, но нужны только для эмуляции чтения DOS-версии ЗА ГРАНИЦЕЙ массива. +Apple II (`CTRLSUBS.S`, `GETBLOCKX`) читает ровно `BlockTable[x]`. + +**Правило:** сверять поведение по SDLPoP, а реализацию под 8 бит — по +Apple II и по комментариям вида «DOS PoP does this» в самом SDLPoP. + +## 7. Повторяющийся источник цены: банковый трамплин в цикле + +Уже трижды крупнейшей статьёй оказывался не алгоритм, а вызов `__banked`- +функции ИЗ ЦИКЛА, идущего в другом банке: + +| место | цена | лечение | +|---|---:|---| +| луч видимости: `pop_tile_at` по колонке (P2b) | 36 786 → 13 002 | один вызов на весь отрезок | +| `pop_clip_char_top` — банк 4 → банк 3 ради одной проверки | 8 892 | не сделано (P11) | +| `pop_trob_modif(room)` на каждый trob в цикле | не мерено | не сделано (P6a) | + +**Что проверять в первую очередь при новом «дорогом» месте:** не сколько +там арифметики, а сколько раз за кадр пересекается граница банка.