SprPoP: идея «готовить следующий уровень под мелодию» — в бэклог, на дальнюю версию
Записана с оговорками, найденными при сегодняшнем разборе: загрузку придётся разрезать на дисковую и палитро-экранную половины, шаг подкачки держать полустраничным, проверить EMM-бюджет на два уровня разом. Половина идеи уже работает — трек заставки играет поверх загрузки (порядок оригинала, замер насоса приложен в записи). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -89,3 +89,47 @@ raw-клавиатура (`<kbd_raw.h>`), которую мы и так заби
|
|||||||
после выхода — заметный. Делать после того, как закроем стражей и
|
после выхода — заметный. Делать после того, как закроем стражей и
|
||||||
займёмся бюджетом всерьёз (там же, где батчинг кроссбанковых вызовов и
|
займёмся бюджетом всерьёз (там же, где батчинг кроссбанковых вызовов и
|
||||||
возможный возврат `pop_bg` в резидент `--w3`).
|
возможный возврат `pop_bg` в резидент `--w3`).
|
||||||
|
|
||||||
|
## Готовить следующий уровень, пока играет мелодия конца текущего
|
||||||
|
|
||||||
|
**САМАЯ ДАЛЬНЯЯ ВЕРСИЯ.** Не полишинг и не порт: это улучшение ПРОТИВ
|
||||||
|
оригинала. Планируем, но не раньше, чем закроем уровни и полишинг.
|
||||||
|
|
||||||
|
**Идея (пользователь, 2026-08-28).** Пока звучит мелодия конца уровня (и
|
||||||
|
трек заставки между уровнями), экран не меняется — значит в это время можно
|
||||||
|
успеть прочитать с диска следующий уровень, чтобы после музыки он появлялся
|
||||||
|
сразу, а не через секунду-другую загрузки.
|
||||||
|
|
||||||
|
**Что УЖЕ сделано и мерено (2026-08-28).** Половина этого уже работает:
|
||||||
|
трек заставки играет ПОВЕРХ загрузки уровня — так же, как в оригинале
|
||||||
|
(`seg003:68-108`: `load_intro` возвращает управление, `load_level()` идёт под
|
||||||
|
музыку, и только потом `while (check_sound_playing())` на чёрном экране).
|
||||||
|
Насос это переживает: 500 подряд вызовов `pop_sfx_fill` через всю загрузку —
|
||||||
|
максимальный зазор 245 832 такта при дедлайне 251 000, ни одной пропущенной
|
||||||
|
порции. Осталась вторая половина: мелодия конца уровня досиживается на
|
||||||
|
ЖИВОМ экране пройденного уровня (как в оригинале, `play_level_2`), и только
|
||||||
|
после неё начинается загрузка.
|
||||||
|
|
||||||
|
**Оговорки, найденные при разборе.**
|
||||||
|
|
||||||
|
1. **Загрузку придётся разрезать надвое.** Сейчас `pop_level_switch` мешает
|
||||||
|
дисковую работу (файл уровня в EMM-страницу, атласы стража и тайлсета) с
|
||||||
|
экранно-палитровой (`pop_bg_load` переписывает записи палитры и атласы,
|
||||||
|
`pop_guard_load` физически применяет цветовые слоты, обе страницы
|
||||||
|
заливаются, `pop_pal_black`). Вторую половину НЕЛЬЗЯ выполнять, пока на
|
||||||
|
экране ещё живёт пройденный уровень — иначе палитра поедет прямо на
|
||||||
|
картинке. То есть в «музыкальное окно» можно вынести только диск, а всё,
|
||||||
|
что трогает палитру и VRAM, остаётся после.
|
||||||
|
2. **Бюджет кадра.** Ожидание мелодии идёт в игровом цикле (гейт
|
||||||
|
`pop_endmus_left` + `pop_music_busy()`), кадр там обычный, 80-100 мс.
|
||||||
|
Шаг подкачки должен быть такого же размера, как музыкальный — полстраницы
|
||||||
|
(~16 мс), а не страница целиком; иначе кадры на экране пройденного уровня
|
||||||
|
начнут дёргаться.
|
||||||
|
3. **Память.** Страницы следующего уровня придётся держать одновременно со
|
||||||
|
страницами текущего — проверить EMM-бюджет (memory `sprinter_emm_budget`),
|
||||||
|
тяжёлые тут не файл уровня, а атласы тайлсета и стража.
|
||||||
|
4. **Риск невелик, но он в самом хрупком месте.** Палитро-атласный обмен —
|
||||||
|
источник уже пойманных багов (`PAL-DUNGEON-STALE`, `PAL-L1-AFTER-INTRO`),
|
||||||
|
и трогать его ради экономии секунды стоит только на спокойную голову.
|
||||||
|
|
||||||
|
**Выигрыш.** Одна-две секунды один раз на уровень.
|
||||||
|
|||||||
Reference in New Issue
Block a user