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` |