From fd54bc78c03be3bbadfac210a087677deba2fe26 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Sat, 8 Aug 2026 16:30:48 +0300 Subject: [PATCH] =?UTF-8?q?DRAW-COST:=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=20=D0=BA=D0=BE=D0=BC=D0=BD=D0=B0=D1=82=D1=8B=202=20(140%?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=82=D0=B8=D0=B2=20210%)=20=E2=80=94=20?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=D0=B4=20=D0=BD=D0=B0=D0=B9=D0=B4=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Комнаты 2 и 3 отличаются ровно телом убитого стража, и оно даёт +20% синей и +50% циана, то есть ~70% кадрового периода. Причина видна в коде: ни roomtest.c, ни pop_cdraw.c не смотрят на Char.alive — мёртвый страж каждый кадр проходит весь путь живого (heal + блит + clip_char + брызги + клинок + перебор тайлов fore), хотя его кадр постоянен до выхода из комнаты. Кандидат на фикс — запечь труп в фон, как loose-плиты. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/TASKS_OPEN.md | 28 ++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) 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, страж убит, Кид стоит) — она воспроизводима и даёт нижнюю границу; худший случай (бой + бег + падающая плита) считать