SprPoP: меню больше не глушит звук на время перерисовки
ui_begin() звал pop_sfx_pause() перед полностраничной accel-копией, и это слышно: pause закрывает CBL целиком (cbl_close), курсор трека стоит, и короткая мелодия начала уровня замирала ровно на время перерисовки меню — а на перемещении по пунктам это повторялось на каждом кадре меню. Обоснование заплатки устарело. Лист, который зовёт gfx_copy_page (_bgi_scroll_rows_raw), режет DI бандами по 16 строк — ~1,6 мс против дедлайна насоса 11,7 мс (85,4 порции в секунду), между бандами есть окно прерываний. Тот же полностраничный копир каждый кадр делают игровой цикл и катсцены, и звук там не рвётся. Скрежет, под который заплатка ставилась, шёл от чтения насосом мусора и вылечен отдельно. Парный pop_sfx_start() в ui_end оставлен: он идемпотентен и чинит вход в меню при закрытом выводе (например сразу после загрузки уровня). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -197,10 +197,21 @@ static uint8_t ui_begin(void)
|
||||
gfx_rect_t full;
|
||||
uint8_t back = (uint8_t)(gfx_get_visible_page() ^ 1);
|
||||
|
||||
/* Полностраничная accel-копия держит DI дольше половины CBL-буфера.
|
||||
* Закрываем вывод, иначе железо повторяет старые 128 байт (скрежет).
|
||||
* ui_end откроет его уже с заново заполненной тишиной. */
|
||||
pop_sfx_pause();
|
||||
/* ЗВУК ЗДЕСЬ БОЛЬШЕ НЕ ГЛУШИМ (снято 2026-08-28).
|
||||
*
|
||||
* Был вызов pop_sfx_pause() с обоснованием «полностраничная accel-копия
|
||||
* держит DI дольше половины CBL-буфера, иначе железо повторяет старые
|
||||
* 128 байт». Обоснование устарело: лист, который зовёт gfx_copy_page
|
||||
* (_bgi_scroll_rows_raw), режет DI бандами по 16 строк — это ~1,6 мс
|
||||
* против дедлайна насоса 11,7 мс, и окно прерываний между бандами есть.
|
||||
* Тот же полностраничный копир каждый кадр делают игровой цикл и
|
||||
* катсцены, и звук там не рвётся.
|
||||
*
|
||||
* А цена была слышимой: pause закрывает CBL целиком (cbl_close), курсор
|
||||
* трека остаётся на месте, и короткая мелодия начала уровня замирала
|
||||
* ровно на время перерисовки меню — «тормозится на кусочек» (жалоба
|
||||
* пользователя 2026-08-28). У оригинала такого нет и быть не может:
|
||||
* там нет насоса, который надо кормить руками. */
|
||||
gfx_set_draw_page(back);
|
||||
full.x = 0; full.y = 0; full.w = GFX_WIDTH; full.h = GFX_HEIGHT;
|
||||
gfx_copy_page(&full, GFX_COPY_DIRECT);
|
||||
@@ -230,6 +241,10 @@ static void ui_end(uint8_t back)
|
||||
{
|
||||
ui_wait_frame(); /* готовый кадр показать только на фронте */
|
||||
gfx_set_visible_page(back);
|
||||
/* Парный к снятому pop_sfx_pause (см. ui_begin) вызов оставлен: он
|
||||
* идемпотентен (открытый CBL возвращает 0 сразу) и чинит случай, когда
|
||||
* в меню вошли при закрытом выводе — например сразу после загрузки
|
||||
* уровня, которая глушит звук намеренно. */
|
||||
(void)pop_sfx_start();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user