Реплики сцены с принцессой: вернуть подкачку в кадр
Регрессия 4086dde: тот коммит перенёс шаг постраничной подкачки «в паузу
кадра» — внутрь цикла ожидания тика насоса — и одновременно ввёл защиту от
промотки (snd_want подтягивается к snd_done). Вместе это убило подкачку:
паузы в этой сцене почти нет, цикл ожидания выходит сразу, шаг не
вызывается. Реплики Джафара не успевали загрузиться к своему тику,
pop_music_play() молча ничего не делал, и после первой реплики сцена шла
в тишине.
Замер в MAME (адреса статиков pop_music.c — от public _pop_mus_page по
смещениям из .sym): до фикса ld_next стоял на нуле 20 секунд при активной
загрузке; после — 11 страниц из 11, mus_ready=1, и звучат все три реплики
m50 → m53 → m52.
Фикс: один безусловный load_step в кадре сцены; шаг в паузе оставлен, он
бесплатный, когда время есть.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3593,3 +3593,39 @@ FIRST_LEVEL`. Рестарт ТОГО ЖЕ уровня (смерть, чекп
|
||||
пишет. Всё, что нарисовано текстом, обязано рисоваться ПОСЛЕ перехода, иначе
|
||||
переезжает только фон (так вышла пустая таблица рекордов, см.
|
||||
[HOF-ENTRY](TASKS_CLOSED.md#hof-entry)).
|
||||
|
||||
---
|
||||
|
||||
<a id="pv-music-stall"></a>
|
||||
## PV-MUSIC-STALL. В сцене с принцессой звучала только первая реплика — **ЗАКРЫТ 2026-08-26**
|
||||
|
||||
**Симптом (пользователь).** «Музыка после открытия двери для входа Джафара
|
||||
пропала» — дальше сцена шла в тишине до конца: не звучали ни реплика входа
|
||||
Джафара (m53), ни его ухода (m52).
|
||||
|
||||
**Корень.** Регрессия коммита `4086dde` («убрана промотка кадров»). До него
|
||||
шаг постраничной подкачки стоял БЕЗУСЛОВНО в теле кадра сцены (плюс там же
|
||||
вызывался `pop_music_service`). Тот коммит перенёс шаг «в паузу кадра» —
|
||||
внутрь цикла ожидания тика насоса — и одновременно ввёл правильную защиту от
|
||||
промотки (`if (snd_done > snd_want) snd_want = snd_done`). Вместе это и убило
|
||||
подкачку: пауза в этой сцене почти не выпадает, цикл ожидания выходит сразу,
|
||||
и шаг не вызывается.
|
||||
|
||||
**Замер, который это показал** (адреса статиков `pop_music.c` вычислены от
|
||||
public `_pop_mus_page` по смещениям из `.sym`):
|
||||
|
||||
| | до фикса | после фикса |
|
||||
|---|---|---|
|
||||
| `ld_next` (прочитано страниц m53) | **0** за 20 с | **11 из 11** |
|
||||
| `mus_ready` | 0 | 1 |
|
||||
| что звучит | только m50 | m50 → m53 → m52 |
|
||||
|
||||
**Фикс.** Один безусловный `pop_music_load_step()` в кадре сцены (шаг в паузе
|
||||
оставлен: он бесплатный, когда время есть). Страница стоит 33 мс против
|
||||
кадра сцены в 100-133 мс, а шкала работает по факту прошедшего времени,
|
||||
поэтому сцена от этого не разъезжается.
|
||||
|
||||
**Ловушка отладки, стоившая ложного диагноза.** Пока машина стоит на
|
||||
брейкпоинте, значения в памяти застывают — картина «`busy=0` при `next=3` из
|
||||
20» выглядела как обрыв чтения с ошибкой, хотя это был просто стоп-кадр.
|
||||
Прежде чем толковать значения, проверять `status`: `state=run` или `stop`.
|
||||
|
||||
Reference in New Issue
Block a user