From bb7cf3091003532ecbbed43bdd41078d813febf6 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Mon, 17 Aug 2026 17:05:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B5=D0=BB=D1=91=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B7=D0=B0:=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D1=8B=20=D0=94=D0=92=D0=90=20=D1=83=D1=81=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=B8=D1=8F=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BA=D0=BE=D0=BF=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B9=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Новый раздел §4: копия годится только если (1) запечка ограничена копируемым прямоугольником — иначе то, что легло вне него, на второй странице остаётся прежним и страницы расходятся (мерцание торцов, ур.1 к.6, кнопка (0,2)); и (2) содержимое тайла между двумя кадрами не менялось — у кнопки с идущим таймером пометка обновляется каждый кадр. Перечёркнут прежний вывод «окно клипа в pop_floor_bake — только вред»: по скорости да, но оно ОБЯЗАТЕЛЬНО как условие (1). Co-Authored-By: Claude Opus 5 --- applications/PoP/docs/perf_green_phase.md | 51 +++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/applications/PoP/docs/perf_green_phase.md b/applications/PoP/docs/perf_green_phase.md index 53fd81e..b4feb57 100644 --- a/applications/PoP/docs/perf_green_phase.md +++ b/applications/PoP/docs/perf_green_phase.md @@ -190,9 +190,51 @@ file-scope, что у `draw_tile`. --- -## 4. Отрицательные результаты — НЕ повторять +## 4. Копия второй страницы — и почему она ТРЕБУЕТ окна клипа -### Окно клипа в `pop_floor_bake` — проверено ТРИ раза, каждый раз хуже +Точечные запечки ставятся с `pages = 2`, срабатывают два кадра подряд (по разу +на страницу дабл-буфера) и оба раза считают одно и то же. После первого раза +нужный прямоугольник уже лежит в ОЗУ-копии первой страницы, и его можно +скопировать: `gfx_copy_page` берёт источником ОЗУ-копию НЕактивной страницы +(то есть ЧИСТЫЙ фон — спрайты рисуются банком без тени и в копию не попадают), +а приёмник обновляет и в видео-ОЗУ, и в ОЗУ-копии. Идея пользователя: тот же +приём, что при перевороте экрана (зелёное зелье), только без зеркала. + +| | полная запечка | копия | +|---|---:|---:| +| щебень / кнопка (60×39) | 179 914 | ~35 000 | +| колодец полосы потолка (64×9) | 138 318 | ~17 500 | + +**ДВА УСЛОВИЯ КОРРЕКТНОСТИ.** Оба нарушались и оба дали видимые баги. + +1. **Запечка обязана быть ОГРАНИЧЕНА копируемым прямоугольником.** + `draw_tile` рисует тайлы ЦЕЛИКОМ, то есть пишет ШИРЕ бара; копия переносит + ровно бар, и всё, что легло вне него, на второй странице остаётся прежним — + страницы расходятся, это видно как МЕРЦАНИЕ через кадр. У полосы потолка + окно стояло с самого начала (G1), у `pop_floor_bake` — нет, и он мерцал + торцами полов, плит и кнопок (найдено пользователем 2026-08-17: уровень 1, + комната 6, Кид на кнопке (0,2)). Поэтому в `pop_floor_bake` окно теперь + стоит КАК УСЛОВИЕ КОРРЕКТНОСТИ, хотя по скорости само по себе убыточно + (см. §5) — снимать его нельзя. +2. **Копия годится только если содержимое тайла между двумя кадрами не + изменилось.** У анимированного тайла (кнопка с идущим таймером связи) + пометка обновляется КАЖДЫЙ кадр и картинка каждый раз другая. Поэтому + `pop_set_redraw`/`pop_set_redraw_above` гасят слот копии при ПЕРЕпометке + (`pop_bake_slot_reset*`). + +Плюс слот `bake_pg`/`bake_pg_above` помнит, НА КАКОЙ странице сделана первая +запечка: копируем только если первая была на ДРУГОЙ странице и дабл-буфер +включён. Это покрывает переплетение двух запечек в одном кадре, однобуфер +(чит SPACE) и смену комнаты (`pop_bake_forget`). + +--- + +## 5. Отрицательные результаты — НЕ повторять + +### Окно клипа в `pop_floor_bake` — по СКОРОСТИ проверено ТРИ раза, каждый раз хуже + +**Но оно всё равно стоит на месте: без него ломается копия второй страницы +(§4).** Ниже — только про скорость самого окна. | попытка | было | стало | |---|---:|---:| @@ -223,7 +265,7 @@ file-scope, что у `draw_tile`. --- -## 5. Журнал правок +## 6. Журнал правок | дата | что сделано | зелёная: покой / дрожь / пик | коммит | |---|---|---|---| @@ -233,3 +275,6 @@ file-scope, что у `draw_tile`. | 2026-08-17 | G3 `blit_b_clip` байты + file-scope | — / 335 400 / **575 730** | `a3c473d` | | 2026-08-17 | `pop_blit_b` file-scope; пакетная пометка кусков | — / — / **557 706** | `b2da0b8` | | 2026-08-17 | коридор heal по высоте композита | 35 760 / 335 400 / **546 900** | `9a50ab2` | +| 2026-08-17 | **копия второй страницы вместо второй запечки** | — / — / **423 558** | `5ef721e` | +| 2026-08-17 | `mob_tick_one` в file-scope; снята оснастка из горячих путей | 35 760 / 326 130 / **414 456** | `18ee60e` | +| 2026-08-17 | фикс мерцания: окно клипа в `pop_floor_bake` как условие корректности копии | замер после фикса — ниже | `35b7cd5` |