PoP roomtest: отладочный обход комнат (+/-) + TODO по редрою пик и idle-skip
ROOMNAV (одна строка #define в roomtest.c): '+'/'-' — следующая/предыдущая комната уровня ПО НОМЕРУ (1..24, с обёрткой), Kid ставится на первый пол, pop_trob_reset() возвращает пики/ворота в исходное. Нужен для обхода всех 24 комнат в поиске багов отрисовки, включая недостижимые обычным путём. Цена — 505 Б кода W1 (22816 -> 23321), они же вычитаются из кучи (4178 -> 3673 Б); W3 не тронут. Переводить приложение в huge ради этого не стали: смена модели памяти (банкованный W1 + трамплины) ради полукилобайта — плохой размен прямо перед прогоном комнат. Номер комнаты — ПОЛОСКАМИ в верхнем борте (слева десятки, справа единицы), а не outtextxy: текст тянет системный знакогенератор (_gfx_font_buf, 2 КБ статики) и сажает кучу до 576 Б. Цвет полосок 0x57, а не WHITE: палитра игровая, запись 15 в ней ЧЁРНАЯ (kid.pal 0x0F = 0,0,0) — из-за этого закомментированный ранее лейбл был бы невидим в любом случае. bug_list.md: раздел TODO (T-1 редрой пик по причине, T-2 idle-skip) + пустая таблица на 24 комнаты под результаты обхода. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -344,3 +344,91 @@ roomtest.c (enter_room/drawn_room/главный цикл), pop_kid.c (кадр
|
||||
Реализовано на 2026-07-22: S1 (kid_room + render_dx) + pop_leave_timer.
|
||||
S2/S3 отложены — баг закрыт odd-pixel поправкой (см. КОРЕНЬ выше).
|
||||
Память: [[pop_seam_room_model]], [[sdlpop_odd_pixel_char_x]].
|
||||
|
||||
---
|
||||
|
||||
# TODO: оптимизация отрисовки (записано 2026-07-29)
|
||||
|
||||
Не баги — план работ. Оба пункта про одно: у оригинала пометка тайла к
|
||||
перерисовке стоит копейки (бит в таблице, которая всё равно чистится каждый
|
||||
кадр), а у нас каждая такая пометка превращается в реальный heal (копию из
|
||||
ОЗУ-копии акселератора) плюс блиты. Поэтому буквальный порт «перерисовываем
|
||||
безусловно» корректен, но дорог.
|
||||
|
||||
## T-1. Пики: перерисовывать по причине, а не безусловно
|
||||
|
||||
**Сейчас:** `pop_process_trobs` зовёт `pop_spike_redraw` каждый кадр для
|
||||
каждой живой пики в комнате (порт `redraw_21h`, который `animate_spike`
|
||||
вызывает вне всяких `if`). Это корректно, но лишнее для пик, до которых
|
||||
Киду дела нет.
|
||||
|
||||
**Надо:** перерисовывать тайл пики, только если
|
||||
1. **сменился её видимый кадр** (шаг выдвижения/уборки), ЛИБО
|
||||
2. **её кто-то стёр** — а стереть у нас может только heal, то есть тайл
|
||||
попал в прямоугольник `kid_heal` этого кадра.
|
||||
|
||||
Это и есть модель оригинала, просто выраженная флагами: `redraw_at_char`
|
||||
(seg003:0576) каждый кадр помечает `set_redraw_fore` тайлы персонажа, причём
|
||||
**объединение текущего и предыдущего** прямоугольника
|
||||
(`MIN(char_top_row, prev_char_top_row)` и т.д.), а `animate_spike` помечает
|
||||
свой тайл. Итог = {тайл сменил кадр} ∪ {тайлы Кида}.
|
||||
|
||||
**Как:** слой Кида и так считает `cL..cR`/`rT..rB` в `pop_fore_over_kid` —
|
||||
пусть публикует их (плюс предыдущие, как в оригинале), а цикл trob'ов
|
||||
сравнивает `tilepos` с диапазоном целочисленно. Никаких пересечений
|
||||
прямоугольников (см. память `manual_hints_over_auto_detect`).
|
||||
|
||||
## T-2. Idle-skip: не перерисовывать Кида, когда ничего не происходит
|
||||
|
||||
**Сейчас:** `kid_heal` → `kid_draw` → `pop_fore_over_kid` идут каждый кадр,
|
||||
даже когда Kid стоит и в его тайлах ничего не меняется. Это ровно поведение
|
||||
оригинала (`draw_game_frame`, seg000:917 — `draw_moving()` + `draw_tables()`
|
||||
безусловно), но у него это дёшево, а у нас нет.
|
||||
|
||||
**Надо:** пропускать heal+draw Кида, когда кадр/поза/координаты не менялись
|
||||
и в его тайлах нет активной анимации.
|
||||
|
||||
**Осторожно (дабл-буфер):** пропускать можно **не раньше второго подряд**
|
||||
неизменного кадра — иначе одна из двух страниц останется со старым
|
||||
содержимым. Условие «обе страницы уже получили это состояние».
|
||||
|
||||
**Связь с T-1:** после T-1 idle-skip не требует ничего дополнительного для
|
||||
пик: раз Кида не перерисовываем — heal'а нет — стирать пики нечем — редрой
|
||||
не нужен, он отпадает сам.
|
||||
|
||||
---
|
||||
|
||||
# Обход всех 24 комнат уровня 1 — поиск багов отрисовки
|
||||
|
||||
Инструмент: `#define ROOMNAV` в `roomtest.c` — `+`/`-` (цифровой блок либо
|
||||
`=`/`-` основного ряда) переключают комнату по номеру (1..24, с обёрткой),
|
||||
Kid ставится на первый пол, `pop_trob_reset()` возвращает пики/ворота в
|
||||
исходное. Номер комнаты — полосками в верхнем борте: слева десятки, справа
|
||||
единицы (`||` `||||` = 24). Убирается закомментированием одной строки.
|
||||
|
||||
| комната | статус | что не так |
|
||||
|---------|--------|------------|
|
||||
| 1 | | |
|
||||
| 2 | | |
|
||||
| 3 | | |
|
||||
| 4 | | |
|
||||
| 5 | | |
|
||||
| 6 | | |
|
||||
| 7 | | |
|
||||
| 8 | | |
|
||||
| 9 | | |
|
||||
| 10 | | |
|
||||
| 11 | | |
|
||||
| 12 | | |
|
||||
| 13 | | |
|
||||
| 14 | | |
|
||||
| 15 | | |
|
||||
| 16 | | |
|
||||
| 17 | | |
|
||||
| 18 | | |
|
||||
| 19 | | |
|
||||
| 20 | | |
|
||||
| 21 | | |
|
||||
| 22 | | |
|
||||
| 23 | | |
|
||||
| 24 | | |
|
||||
|
||||
Reference in New Issue
Block a user