Зелёная фаза: записаны ДВА условия корректности копии второй страницы

Новый раздел §4: копия годится только если (1) запечка ограничена
копируемым прямоугольником — иначе то, что легло вне него, на второй
странице остаётся прежним и страницы расходятся (мерцание торцов, ур.1
к.6, кнопка (0,2)); и (2) содержимое тайла между двумя кадрами не
менялось — у кнопки с идущим таймером пометка обновляется каждый кадр.

Перечёркнут прежний вывод «окно клипа в pop_floor_bake — только вред»:
по скорости да, но оно ОБЯЗАТЕЛЬНО как условие (1).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 17:05:29 +03:00
parent 35b7cd5196
commit bb7cf30910
+48 -3
View File
@@ -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` |