diff --git a/applications/PoP/docs/perf_registry.md b/applications/PoP/docs/perf_registry.md index f0ed4f1..5d9d79c 100644 --- a/applications/PoP/docs/perf_registry.md +++ b/applications/PoP/docs/perf_registry.md @@ -337,10 +337,38 @@ heal 141 048 + отрисовка 148 566 = 290 000 тактов (36 % рабо (0,8), где он и стоит. Там фон честно меняется, и оригинал персонажа тоже перерисовывает. -### P4. Накладные блита — ЧАСТИЧНО, эффект много меньше ожидаемого +### P17. 16 бит там, где хватает 8 ✅ 2026-08-19 (замечание пользователя) -**Сделано 2026-08-19: каталог атласа читается из W0** (`atlas_image_w0` в -libbgi) вместо переключения W3 в `atlas_image`. **−408 на кадре.** +**1. Границы экрана — беззнаковыми сравнениями.** Проверка «спрайт целиком +на экране» стояла как четыре ЗНАКОВЫХ 16-битных сравнения, а знаковое у +SDCC z80 разворачивается в `sbc` плюс `jp PO / xor 0x80 / jp P`. +Беззнаковая форма делает то же двумя: отрицательная координата становится +очень большой и проваливает условие так же, как `>= 0`. **−378.** + +**2. Габариты спрайтов в байтах.** `w`/`h`, `ow`/`oh`, `fpw`/`fph`, +`cw`/`ch` в `pop_cdraw_t`, параметры `cd_overlay_add`/`cd_clip_add`, локали +в `pop_char_draw`/`cd_splash` и чтение габарита из шапки ленты были +`uint16_t`, хотя спрайты атласов не крупнее 64×64 (memory +`pop_sprite_size_limits`). **−276 в статике, −1 134 в циане динамики**, +плюс 24 байта `_DATA`. + +### P4. Накладные блита — ОТКАЧЕНО + +**Правка сделана и отменена по решению пользователя.** Критерий: если +выигрыш получен ценой сильно усложнённого кода — откатывать. + +Что было: `atlas_image_w0` в libbgi читал каталог из уже подключённой в W0 +страницы. **−408 на кадре** при ожидании −5 400. + +Почему откачено: цена — вторая публичная функция в API libbgi с НЕЯВНЫМ +контрактом («страница обязана быть подключена до вызова»), которую легко +вызвать неправильно и молча получить мусор, плюс дублирование чтения +каталога. 408 тактов — 0,09 % кадра, меньше разброса между прогонами. + +**Что осталось знанием:** сам `gfx_w0_map` стоит всего **324** такта, а 672 +у `atlas_image` — это почти целиком вызов функции и арифметика `idx * 8`. +Значит непробованная часть P4 («один map на группу блитов») имеет потолок +~2 600 за кадр, а не 10 000, как считалось. Ожидание было −5 400 (672 такта × 8 блитов зелёной фазы), и оно НЕ оправдалось: цена блита 16 107 → 16 005, то есть −102. Причина в том, что @@ -560,8 +588,9 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за | **после P15, лёгкая** | **464 796** | 223 902 | 181 494 | **59 406** | 4 | | после P15, тяжёлая | 617 487 | 245 808 | 181 761 | 192 090 | **4 везде** | | после P16, лёгкая | 438 978 | 218 052 | 181 494 | 39 438 | 4 | -| **после P4, лёгкая** | **438 570** | 217 824 | 181 086 | 39 210 | 4 | -| **после P4, тяжёлая** | **602 574** | 242 082 | 181 347 | 181 404 | 4 | +| ~~после P4~~ | ~~438 570~~ | | | | правка **ОТКАЧЕНА** | +| **после P17, лёгкая** | **438 324** | 217 590 | 181 098 | 39 192 | 4 | +| **после P17, тяжёлая** | **603 684** | 241 956 | 181 464 | 180 270 | 4 | Итог восьми позиций: **801 768 → 464 796 в лёгкой позиции (−42 %)** и **758 358 → 617 487 в тяжёлой (−19 %)**. Отдельно важно: в тяжёлой позиции @@ -572,8 +601,8 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1) — только отдельным за Цель: работа ≤ 430 000, тогда период станет 3 растра (хвост кадра — три `gfx_wait_vsync`). -- в ЛЁГКОЙ позиции снять надо **8 570**; -- в ТЯЖЁЛОЙ — **172 574**. +- в ЛЁГКОЙ позиции снять надо **8 324**; +- в ТЯЖЁЛОЙ — **173 684**. **Лёгких путей больше не осталось.** За 2026-08-19 отвергнуто ЧЕТЫРЕ правки подряд (три с регрессом, одна почти без эффекта), и все они целили