diff --git a/applications/SprPoP/docs/ideas_backlog.md b/applications/SprPoP/docs/ideas_backlog.md index 87a0878..2709c66 100644 --- a/applications/SprPoP/docs/ideas_backlog.md +++ b/applications/SprPoP/docs/ideas_backlog.md @@ -89,3 +89,47 @@ raw-клавиатура (``), которую мы и так заби после выхода — заметный. Делать после того, как закроем стражей и займёмся бюджетом всерьёз (там же, где батчинг кроссбанковых вызовов и возможный возврат `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`), + и трогать его ради экономии секунды стоит только на спокойную голову. + +**Выигрыш.** Одна-две секунды один раз на уровень.