Разработка и ромхакинг > Ромхакинг
[NES] Contra Force - повышенная частота кадров
vova791:
Короче скормил нейронке исходники игры с задачей выйти на 50+ фпс, удалось не везде, но играется в разы лучше чем оригинал. Проверилось на фсеуксе, нестопии, месене - работает, на пунес виснет после выбор персонажа, разбирать почему - лень. У кого есть возможность, потестируйте пожалуйста на флешкарике и реальной консоли и напишите результат.
--
v09 - рекомендованная версия, но если прямо не запускается или вас очень сильно парит её размер то см. ниже
v10 - размер с 640кб до 384кб уменьшен, но может быть небольшой откат в фпс 1-2 и какие-то баги (тесты особо не проводились). Оставляю оба рома на выбор.
v17 - перевод на новый маппер VRC6 ещё выше средний фпс, финальная, дальше заниматься уже не хочется. Только если багофиксы.
Ниже более подробное описание составленное нейронкой.
--- Цитировать ---# Contra Force [v09] — MMC3 accelerated preview
Задача проекта — уменьшить тормоза, сохранив уровни, графику и основные игровые механики. Ускорение получено изменениями кода игры, без разгона процессора в эмуляторе.
По записям прохождений средняя скорость во время игры выросла с **37,17 FPS у оригинала до 53,80 FPS у v09**. Катсцены, меню и паузы из расчёта исключены. Стабильные 60 FPS во всей игре пока не достигнуты.
## Что сделано от начала проекта до v09
### 1. Восстановлена сборка оригинальной игры
За основу взято дизассемблирование из проекта [NES-Games-Disassembly](https://github.com/cyneprepou4uk/NES-Games-Disassembly). Сначала исходники собраны в ROM, побайтово совпадающий с оригиналом.
Затем на тяжёлых сценах измерены расходы процессора: обработка объектов, столкновения, подготовка фона, сборка спрайтов и переключение банков памяти.
### 2. Ускорены повторные обращения к карте и сборка спрайтов
Добавлен кеш метатайлов — небольших блоков карты, к которым игра постоянно обращается при движении и проверках столкновений.
Для спрайтов последовательно проверялись кеширование готовых данных и относительных координат частей объекта. Эти эксперименты дали первые сокращения времени обработки и помогли определить следующие узкие места.
### 3. Перестроена организация игрового кадра
Это основной архитектурный этап проекта.
Расчёт игровой логики и подготовка спрайтов перенесены из длинного обработчика видеопрерывания в основной цикл процессора. Короткое видеопрерывание выводит только полностью подготовленный кадр.
Вместе с кадром фиксируются параметры прокрутки, графические банки и данные растровых прерываний. Убраны лишние копирования: готовые спрайты передаются через DMA напрямую, а команды фона читаются из подготовленного буфера.
### 4. Исправлены ошибки ранних ускоренных сборок
В версиях v02–v06 исправлены обнаруженные при тестировании регрессии:
- дрожание фона;
- чёрный экран и зависания при паузе, катсценах и переходах;
- повреждение нижней панели при вертикальной прокрутке;
- задержки разрушения объектов и оставшиеся изображения на фоне;
- скачки изображения при переходах на крылья самолётов;
- неправильное поведение ракет и стрельбы;
- повреждение фона в сцене с вертолётом.
Устранено смешивание данных разных кадров и сокращена работа, которую нужно успеть выполнить во время вертикального гашения.
Генератор случайных чисел также переработан, чтобы убрать зависимость случайных событий от изменившегося времени выполнения. Поэтому отдельные случайные ситуации могут отличаться от оригинала.
### 5. Добавлен заранее подготовленный вывод спрайтов
В v07 появился компилятор спрайтовых поз: **630 часто используемых шаблонов** преобразуются при сборке ROM в готовые процедуры вывода.
Это сокращает повторный разбор графических данных во время игры. Для остальных случаев сохраняется исходный обработчик.
### 6. Ускорены столкновения и служебная работа с объектами
В v08 переработан обход целей при проверках столкновений с сохранением их порядка и масок попаданий.
Также ускорены очистка таблицы спрайтов и расчёты камеры: повторяющиеся операции выполняются один раз за игровое обновление.
### 7. Дополнительные сокращения в v09
В текущую версию вошли:
- более раннее отсеивание неподходящих целей при столкновениях;
- копирование только необходимой части команд фона;
- прямое сохранение параметров готового кадра;
- повторное использование рассчитанной скорости объектов;
- сокращённое переключение банков памяти во время игры.
Экспериментальные изменения, показавшие повреждение изображения или расхождения состояния, в v09 не включены.
## Сравнение с оригиналом
Измеряются **завершённые игровые обновления**, а не только опросы управления. «Худшая секунда» — самое медленное полностью игровое окно из 60 видеокадров.
| Уровень | Оригинал: среднее | v09: среднее | Оригинал: худшая секунда | v09: худшая секунда |
|---|---:|---:|---:|---:|
| 1 | 42,44 | **58,71** | 30,05 | **45,07** |
| 2 | 40,80 | **56,67** | 30,05 | **42,07** |
| 3 | 36,57 | **50,23** | 23,04 | **32,05** |
| 4 | 34,51 | **53,85** | 29,05 | **39,06** |
| 5 | 32,82 | **48,74** | 30,05 | **38,06** |
| **Общее среднее** | **37,17** | **53,80** | — | — |
Это разные человеческие прохождения: маршрут, оружие, смерти и случайные события различаются. Таблица описывает результаты этих записей; всю разницу нельзя приписывать исключительно оптимизации.
Отдельно v08 и v09 сравнивались на одинаковых входах в пяти контрольных сценах — по 600 игровых обновлений. В этих тестах v09 дала дополнительное ускорение, а все 838 сравниваемых байтов состояния совпали на каждом обновлении.
Полная запись v09 воспроизведена в FCEUX 2.6.6: **65 596 видеокадров без расхождений записанных lag-флагов**.
## Что ещё тормозит
Тяжёлые сцены остаются. В выбранном пятисекундном отрезке третий босс даёт около **34,46 FPS**, бой с вертолётом пятого уровня — **41,87 FPS**.
Около **27% игровых секундных окон** прохождения v09 остаются ниже 50 FPS. Работа над стабильными 50+ продолжается.
## Требования и запуск
Сборка использует стандартный **MMC3, mapper 4**:
- 512 КиБ PRG-ROM;
- 128 КиБ CHR-ROM;
- 8 КиБ PRG-RAM.
Для картриджа нужна MMC3-плата с соответствующей памятью. Оригинальная плата Contra Force — TLROM без рабочей RAM, поэтому немодифицированная плата оригинального картриджа для этой сборки не подходит. [Данные оригинального картриджа](https://nescartdb.com/profile/view/1152/contra-force).
Проверки проводились в FCEUX 2.6.6 без overclock. Проверка на реальной NES пока не проведена.
--- Конец цитаты ---
Segaman:
размер рома жесть.
играется бодро.
на самолете подлагивает.
на последнем уровне безбожно лагает.
размер рома ёмаё, а под что столько?
vova791:
Segaman, кеш, кеш и ещё раз кеш. (но есть 128кб пустых). Я не очень с размером пока заморачивался раз работает.
Да, самый идеал 1й получился, второй так сяк, потом оставшиеся уже 40-45+. Но когда я запустил оригинал то был в шоке насколько он тормозной, так что сойдёт. Я разные оптимизации с нейронкой перебирал, везде выигрыш по итогу уже в 1 средний фпс долбился.
Так что думаю если сохранять конечный вывод с такой же физикой и прочим - это почти предел. Нужно более радикально игру переписывать для стабильного 60фпс результата.
--
обновил ром с меньшим размером, попробуй
safronoff:
Евгений Кузнецов aka EvgenyKz также делал свой проект по оптимизации Contra Force.
Но у него дизасм не ии анализировал, а он сам.
Не знаю, насколько ии сделал всё адекватно, но Евгений мне говорил, что в игре даже анимации объектов сделаны через одно место, т.е. в оптимизации нуждается даже это, и в целом код игры как будто студентами дописывался.
У него, кстати, ром весит 384 кб, и используется WRAM 128 кб.
Ром пока нуждается в доработке.
MaxWooD:
vova791, ЭТО КРУТО :thumbup:
За счёт чего можно ещё снизить тормоза и повысить FPS?
vova791:
MaxWooD, новый маппер (я решил оставаться в пределах ммс3 и реального железа). И полная переписка движка, его основ логики, но тогда выходной вариант не будет 1 в 1 как в оригинале (к чему я тоже стремился).
Остальные варианты что были перебраны уже сводились к 0,5-1 среднего выигрыша фпс, если такого 10 найти то может в итоге плюс, но не факт и новые ошибки вводит такое.
Arrogant:
Попробовал на флеш картридже и на портативке уменьшенный по размеру ром. По сравнению с оригиналом - небо и земля. Да, есть, как выше писали, тормоза на самолёте и в последнем уровне, но играется намного лучше. Спасибо за проделанную работу :thumbup:
vova791:
Arrogant, о классно, что на реальном железе работает хорошо.
На денди кстати возможно меньше тормозов будет. :lol:
MaxWooD:
--- Цитата: vova791 от 02 Октября 2026, 08:59:07 ---новый маппер (я решил оставаться в пределах ммс3 и реального железа)
--- Конец цитаты ---
А почему не использовали VRC6?
vova791:
MaxWooD, для меня когда игра на новом маппере уже не то, будто какой-то чит. думаю на ммс5 она бы летала везде.
safronoff:
vova791, это всё, конечно, хорошо, но почему-то очень мало пишут про баги.
Например, при ходьбе влево с зажатой диагональю вверх, ни у одного из персонажей не срабатывает кнопка прыжка, а срабатывает только при зажатом турбопрыжке. Также если без диагонали бежать влево, прыжок может не всегда сработать.
Также хотелось бы, чтобы в игре были доработаны следующие вещи:
1) внедрить неиспользованные анимации Бёрнса и некоторых простых врагов: https://tcrf.net/Contra_Force
2) исправить физику последнего конвейера на 1 уровне (если на нём лечь, персонажа не сносит назад, хотя ящики при этом съезжают влево)
3) решить что-то с возможностью нажатия паузы на экранах с боссом (она то срабатывает, то нет, в зависимости от уровня). Я предлагаю либо вообще отключить паузу на боссах, либо (что куда лучше) сделать недоступным именно вызов временных помощников, чтоб выдавало что-то в духе "choose another player". Раз уж стали оптимизировать игру, то не будет лишним её ещё и доработать.
vova791:
--- Цитата: safronoff от 02 Октября 2026, 19:52:01 ---Например, при ходьбе влево с зажатой диагональю вверх, ни у одного из персонажей не срабатывает кнопка прыжка, а срабатывает только при зажатом турбопрыжке.
--- Конец цитаты ---
так работает, только что проверил. Можете снять мувик в эмуляторе и сказать какой ром чтобы посмотреть что там происходит?
остальное мне не интересно, была задача именно в оптимизации.
MaxWooD:
Кстати, что касается улучшений, может быть получится прикрутить более продвинутый ИИ для помощников?
Идея у разрабов была очень крутая, но реализовать до нормального уровня так и не получилось...
И время на помощников я бы все-таки увеличил.
Agent Smith:
Раньше играли и всех устраивало. Никто не обращал внимания на проседание скорости.
Но я понял так: старые тормоза убрали, новые добавили?
safronoff:
--- Цитата: MaxWooD от 02 Октября 2026, 21:57:39 ---Идея у разрабов была очень крутая, но реализовать до нормального уровня так и не получилось...
--- Конец цитаты ---
Оригинальный Arc Hound разрабатывала сама Конами, но релиз игры в Японии отменили, боясь того, что игра не окупится. Перерабатывала игру уже сторонняя контора, которая и наломала дров по итогу.
--- Цитировать ---И время на помощников я бы все-таки увеличил.
--- Конец цитаты ---
В том-то и дело, что в Arc Hound ии помощники были полноценными игроками. В сети можно найти скрины этой игры, и там у помощников тоже счётчик жизней есть, отличием от реального игрока служит надпись "CPU" выше имени.
А некоторые товарищи считают хак Контры Форс из RHDN, с перехаченным титульником, "тем самым японским прототипом", хотя он на том же маппере, с теми же тормозами и тем же левел-дизайном, что в американке, лол. :lol:
Добавлено позже:
--- Цитата: vova791 от 02 Октября 2026, 19:58:36 ---так работает, только что проверил. Можете снять мувик в эмуляторе и сказать какой ром чтобы посмотреть что там происходит?
--- Конец цитаты ---
Сделал мувик, хотя это очевидный баг, когда управление работает нормально только в правой стороне, а в левой не хочет.
Не забудьте отображение нажатых кнопок внизу включить - так виднее будет, в чём проблема.
Про Игрок:
Взяли сломали пропуск второго уровня своим расширением буфера :)
vova791:
safronoff, на записи когда влево идёте буквально кнопка прыжка в отображении не жмётся, этого буквально в самом файле нет. У вас всё нормально? Проверяйте проблемы со своей стороны, что у вас там сломалось.
4942 .L.U...A - вот тут у вас первое нажатие А и это турбо нажатие и он его обрабатывает
Вот запись что всё отлично работает.
Ti_:
Не запускается уровень на fceux/mesen с настройками ram init random.
vova791:
Ti_, о, полезный баг. При рандоме и фф там флаг готовности экрана ставился тру и игра пыталась уровень неготовый грузить, пофикшено. По этому и пунес не грузил.
safronoff:
--- Цитата: vova791 от 03 Октября 2026, 04:34:49 ---safronoff, на записи когда влево идёте буквально кнопка прыжка в отображении не жмётся, этого буквально в самом файле нет. У вас всё нормально? Проверяйте проблемы со своей стороны, что у вас там сломалось.
4942 .L.U...A - вот тут у вас первое нажатие А и это турбо нажатие и он его обрабатывает
Вот запись что всё отлично работает.
--- Конец цитаты ---
Перенастроил управление. Заработало. Видимо, дело в прерываниях. На ноуте относительно недавно начал играть.
Навигация
Перейти к полной версии