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:
@@ -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, страж убит, Кид стоит) — она воспроизводима
|
||||
и даёт нижнюю границу; худший случай (бой + бег + падающая плита) считать
|
||||
|
||||
Reference in New Issue
Block a user