Плавающий темп музыки оказался не придиркой людей с чрезмерно музыкальным слухом (как я сразу подумал), а реальной ошибкой, которая проявлялась только на точных эмуляторах (Nintendulator, puNES, Nestopia) и на реальном железе. Ошибка была допущена в версии 1.3.0, и исправлена в новой версии 1.3.1. Никаких других изменений, кроме исправленной ошибки, в этой версии нет.
Скачать: unchained_nostalgia.zip (20КБ). Страница проекта →
Ранее несколько человек писало мне, что музыка в демке «плавает». Я всё никак не мог понять о чём речь, ведь у меня в FCEUX всё звучало отлично. Тогда я решил, что у людей просто чрезмерно музыкальный слух, и они придираются к автоматической адаптации скорости воспроизведения, которую я добавил для того, чтобы Famicom и NES NTSC/PAL всё звучало аналогично Dendy, для которой оригинальная менюшка и создавалась.
На самом деле, давным-давно пробовал запускать и в Nintendulator — работало неидеально, но я подумал, что это просто производительности компьютера не хватает для точной эмуляции. Но сейчас что-то стукнуло проверить ещё раз, да ещё и сравнить с оригиналом, включив эмуляцию Dendy, где всё должно быть идентично оригинальной менюшке, ведь адаптация скорости воспроизведения и высоты тона тут не должны активироваться. Каково же было моё удивление, когда я обнаружил, что в оригинальном меню звук не «плавает», а в моей демке — «плавает», да ещё как! Как оказалось, проблема также проявляется в puNES, Nestopia и на реальном железе. В более ранних версиях демки проблема не обнаружилась, то есть возникла она именно в версии 1.3.0. Точности эмуляции FCEUX не хватило для того, чтобы выявить эту регрессию на ранних стадиях разработки.
Источник проблемы был найден. Виной всему оказалась неочевидная особенность работы железа, которая не эмулируется FCEUX: чтение PPUSTATUS ($2002) ровно в момент когда должно вызваться прерывание NMI предотвращает этот вызов. В конце каждого кадра код демки в цикле читает PPUSTATUS с целью узнать, не было ли переполнения при отрисовке спрайтов (что случается когда на одной линии встречается более 8 спрайтов). В случае переполнения — порядок вывода спрайтов менялся. Ирония в том, что реальной необходимости в этом коде не было. Оно было сделано исключительно для красоты представления таблицы спрайтов (OAM) в памяти. Здесь мой перфекционизм и стремление сделать всё красиво не только снаружи, но и внутри, подвели меня. В основном режиме на одной линии никак не может встретиться больше 6 спрайтов (две чайки по 3 спрайта в длину). Большее число спрайтов на одной линии может встретиться только при активации пасхалки со взрывами. Мне хотелось, чтобы порядок вывода спрайтов не изменялся каждый кадр без необходимости, чтобы таблица OAM в памяти выглядела более красивой и стабильной при её просмотре в отладчике эмулятора, чтобы каждый спрайт находился в своём фиксированном месте в памяти каждый кадр.
Чтобы преодолеть ограничение 8 спрайтов на линию, игры обычно просто меняют порядок вывода спрайтов с прямого на обратный (и наоборот) каждый кадр. В новой версии Unchained Nostalgia применён этот же трюк.
Комментарии закрыты. Обсудить можно здесь →