DRAW-COST: контрольный замер комнаты 2 (140% против 210%) — след найден

Комнаты 2 и 3 отличаются ровно телом убитого стража, и оно даёт +20% синей
и +50% циана, то есть ~70% кадрового периода.  Причина видна в коде: ни
roomtest.c, ни pop_cdraw.c не смотрят на Char.alive — мёртвый страж каждый
кадр проходит весь путь живого (heal + блит + clip_char + брызги + клинок +
перебор тайлов fore), хотя его кадр постоянен до выхода из комнаты.

Кандидат на фикс — запечь труп в фон, как loose-плиты.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 16:30:48 +03:00
parent 14190f0210
commit fd54bc78c0
+27 -1
View File
@@ -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, страж убит, Кид стоит) — она воспроизводима
и даёт нижнюю границу; худший случай (бой + бег + падающая плита) считать