diff --git a/applications/PoP/roomtest/TASKS_OPEN.md b/applications/PoP/roomtest/TASKS_OPEN.md index 0f409ec..7a20d1c 100644 --- a/applications/PoP/roomtest/TASKS_OPEN.md +++ b/applications/PoP/roomtest/TASKS_OPEN.md @@ -55,7 +55,7 @@ | 2 | [L3-CHOMP](#l3-chomp) | **СЛЕДУЮЩАЯ**: чомперы (5 шт) | прохождение ур. 3 | | — | [L3-SKEL](#l3-skel) | скелет ур. 3 — **сделан 2026-08-07**, ждёт финальной приёмки | — | | 3 | [L3-PASS](#l3-pass) | приёмка уровня 3 (обход комнат) | закрытие цели | -| — | [DRAW-COST](#draw-cost) | **кадр не укладывается в бюджет: ~210 % кадрового периода в ПОКОЕ** (замер 2026-08-08) | плавность на ВСЕХ уровнях | +| — | [DRAW-COST](#draw-cost) | **кадр не укладывается в бюджет: ~210 % кадрового периода в ПОКОЕ** (комн. 3), 140 % без трупа стража (комн. 2) | плавность на ВСЕХ уровнях | | — | [L1-SPEED](#l1-speed) | игра на ~39 % быстрее оригинала | ощущение от ВСЕХ уровней; берётся в любой момент | | — | [TUNE-1](#tune-1) | параметры движка → cfg-файл (сейчас `pop_tune.h`) | отладка таймингов и моды; берётся по мере надобности | @@ -330,6 +330,32 @@ W1/W2 (см. [BUG-GUARD-COLOR-1](bug_closed.md#bug-guard-color-1)). > **Итого ~210 % — больше ДВУХ кадровых периодов на кадр.** Это много; в > покое должно оставаться место под бой, движение и вторую фигуру. > Приоритет задачи поднят: это уже не косметика профиля. +> +> **Контрольный замер там же: комната 2** — та же по устройству, но БЕЗ тела +> стража: 60 % / 20 % / 60 % = **~140 %**. + +### Первый след: ТЕЛО УБИТОГО СТРАЖА стоит ~70 % кадра + +Комнаты 2 и 3 отличаются ровно одним — трупом, и он даёт +20 % синей и ++50 % циана. Причина видна прямо в коде и НЕ требует замера: ни +`roomtest.c`, ни `pop_cdraw.c` не смотрят на `Char.alive`. Мёртвый страж +сохраняет `charid != 0`, поэтому КАЖДЫЙ кадр честно проходит весь путь +живого персонажа — `pop_char_heal(OPP)` (стереть), `pop_char_draw(OPP)` +(блит + clip_char + брызги + клинок), `pop_char_fore(OPP)` (перебор тайлов +футпринта с разбором кладки). При этом труп НЕ МЕНЯЕТСЯ: его кадр +постоянен до выхода из комнаты. + +**Что напрашивается** (порядок — от дешёвого к дорогому, каждое МЕРИТЬ): +1. запечь труп в фон один раз, как делают loose-плиты (`pop_floor_bake`) — + тогда heal сам его восстанавливает, а per-frame путь исчезает целиком. + Сверить с SDLPoP: там мёртвый страж остаётся обычной записью objtable, но + у нас нет их системы «перерисовать только грязные тайлы», и запечка — наш + штатный ответ на «статичный элемент поверх фона» (см. `pop_loose_floors`); +2. если запечка не годится (труп надо стирать при выходе/рестарте) — + минимум пропустить `pop_char_fore(OPP)` для мёртвого: передние грани + вокруг неподвижного тела тоже не меняются. + +Проверять на той же паре комнат 2/3 — разница должна схлопнуться. Мерить в ЭТОЙ точке (комната 3, страж убит, Кид стоит) — она воспроизводима и даёт нижнюю границу; худший случай (бой + бег + падающая плита) считать