From aa845c0362210de7bfba8ccc80b0be5b8421e118 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Mon, 17 Aug 2026 18:50:56 +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=D0=B0=20=D0=B8=D0=B4=D0=B5=D1=8F=20G8=20=E2=80=94?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=82=D0=BA=D0=B0=20=D1=81=D0=BE?= =?UTF-8?q?=D1=81=D0=B5=D0=B4=D0=B0=20=D1=83=D0=B7=D0=BA=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BE=D1=81=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Идея пользователя 2026-08-17. При падении плиты помечаются ДВА тайла, и сосед перезапекается ЦЕЛИКОМ и ПОВТОРНО (draw_tile для него зовётся дважды), хотя потревожили у него только левые 28 px — там, куда свисает правая грань упавшего тайла. В записи разведено, что 60 = 32 свой тайл + 28 СОБСТВЕННЫЙ свес (сужать нельзя), и сузить можно только пометку «изменился мой ЛЕВЫЙ сосед». Плюс три условия: pop_floor_bake общая (кнопка/зеркало/предмет/щебень) и нужен отдельный вход; вертикальные диапазоны двух запечек НЕ совпадают (20 строк против 39), поэтому просто снять вторую пометку нельзя; ширину полосы брать по максимальному свесу. Брать ПОСЛЕ обхода всех уровней — решение пользователя. Co-Authored-By: Claude Opus 5 --- applications/PoP/docs/perf_green_phase.md | 47 ++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/applications/PoP/docs/perf_green_phase.md b/applications/PoP/docs/perf_green_phase.md index b4feb57..37e962b 100644 --- a/applications/PoP/docs/perf_green_phase.md +++ b/applications/PoP/docs/perf_green_phase.md @@ -181,7 +181,52 @@ BUG-LATTICE-DOORTOP, BUG-SEAM-WEDGE-1), проверять придётся пр Остаётся `mob_tick_one` (~4 500 на кусок = 27 000 на кадр) — то же лечение file-scope, что у `draw_tile`. -### G8. Снять временную оснастку +### G8. Пометка соседа — узкой полосой, а не полным тайлом (идея пользователя) + +**Ожидание: заметное, но не мерено. Взять ПОСЛЕ обхода всех уровней** +(решение пользователя 2026-08-17: пока идёт отлов багов слоёв, каждая правка +добавляет переменных в картину). + +Когда плита (1,8) падает, помечаются ДВА тайла: + +| пометка | что делает | +|---|---| +| `(1,8)` → `RD_LOOSE_GONE` | бар 40 на своём x, бар 32 на соседе, `draw_tile(1,8)` + `draw_tile(1,9)` | +| `(1,9)` → `RD_FLOOR` | бар **60** на x соседа, `draw_tile(1,9)` ЕЩЁ РАЗ | + +То есть сосед перезапекается ЦЕЛИКОМ и ПОВТОРНО, хотя потревожили у него +только левые 28 пикселей — там, куда свисает правая грань упавшего тайла. +`draw_tile(1,9)` при этом вызывается дважды на одну пометку. + +Что такое эти числа (чтобы не сузить лишнего): + +- **60 = 32 свой тайл + 28 СОБСТВЕННЫЙ свес.** Правая грань пола (кадр 42, + 26 px) рисуется в клетке соседа с `x+32`, занимая `x+32..x+57`. Для запечки + САМОГО тайла 60 уже минимальны — сужать их нельзя; +- сузить можно только тот случай, когда тайл помечен ПОТОМУ ЧТО ИЗМЕНИЛСЯ ЕГО + ЛЕВЫЙ СОСЕД: тогда нужна полоса 28 px у левого края, а не весь тайл. + +Почему выигрыш не символический: `pop_floor_bake` стоит **179 914** тактов, +из них 105 500 — сами блиты. Узкая полоса срезала бы и площадь бара +(60×39 → 28×39), и часть блитов — окно клипа там теперь стоит обязательным +(см. §4), так что отсев достаётся даром. + +**Условия, из-за которых это не «просто уменьшить число»:** + +1. `pop_floor_bake` — ОБЩАЯ функция: её же зовут кнопка (`pop_button_redraw`), + зеркало, подобранный предмет и щебень на месте посадки. Там меняется сам + тайл и 60 нужны целиком. Значит нужен отдельный вход (напр. + `pop_floor_bake_edge(row, col)`) или параметр-прямоугольник — именно под + пометку «изменился мой левый сосед». +2. Прежде чем выкидывать вторую пометку целиком, сверить ВЕРТИКАЛЬНЫЕ + диапазоны: `pop_loose_bake_empty` кроет `63*row+46 .. +65` (20 строк), а + `pop_floor_bake` — `yb+26 .. yb+64` (39 строк). То есть сосед покрыт + ВТОРЫМ баром не полностью, и просто снять пометку нельзя. +3. Ширина полосы = свес ЛЕВОГО тайла, а он зависит от типа тайла (у loose это + 8 px по комментарию в `pop_loose_bake_empty`, у пола 26). Брать по + максимуму (28) — безопасно. + +### G9. Снять временную оснастку Шесть `pop_dbg_b1..b6` внутри `pop_blit_b` — ~400 такта на блит; при 15 блитах зелёной это 6 000 на кадр. Плюс `pop_dbg_kind`/`m16` (2 вызова на