From 9e03739bb0b637b26626470c5cd806f35bc982b6 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 19 Aug 2026 18:02:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B5=D1=81=D1=82=D1=80:=20P4=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=D1=87=D0=B5=D0=BD,=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20P17=20(=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D1=80=D1=8F=D0=B4=D0=BD=D0=BE=D1=81=D1=82=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P4 (каталог из W0) отменён по критерию пользователя: 408 тактов не стоят второй публичной функции в libbgi с неявным контрактом «страница уже подключена». Знание сохранено: gfx_w0_map стоит 324, поэтому потолок непробованной части P4 — около 2 600, а не 10 000. P17 — по замечанию пользователя про 16 бит там, где хватает 8: границы экрана беззнаковыми сравнениями (-378) и габариты спрайтов в uint8_t (-276 в статике, -1 134 в циане динамики, плюс 24 байта _DATA). Бюджет: лёгкая 438 324, тяжёлая 603 684. Co-Authored-By: Claude Opus 5 --- applications/PoP/docs/perf_registry.md | 43 +++++++++++++++++++++----- 1 file changed, 36 insertions(+), 7 deletions(-) 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 отвергнуто ЧЕТЫРЕ правки подряд (три с регрессом, одна почти без эффекта), и все они целили