Gaming
Игры РФ· DTF· JustMK

Про Dreamcast и порты с ее аркадных сестер — SEGA Naomi и Sammy Atomiswave

А вы вообще в курсе, что сущестовали аркадные автоматы со схожей с Dreamcast архитектурой? Нет? Пора делать внезапные открытия.

Постараюсь изложить все максимально простым языком для всех людей, которые хоть сколько-то, но общались с современной цифровой техникой, что влечет за собой ряд существенных упрощений в описании принципов работы того или иного процесса\железа. За это прошу простить и принять это как данность.

Статейка родилась в моем уме с воспоминания о том, что Николай Губанов aka Pixel Devil года три назад сваял аж целых два (раз и два) видео про то, как он пытался собрать дома живой игровой автомат на базе SEGA Naomi — все ради того, чтобы нативно поиграть в те самые аркадные игры (и далеко не самые худшие в истории, я вам скажу!!!). Труд получился монументальный, увлекательный и крайне интригующий. Особенно тем, что вообще скрывается средь игровых автоматов, что столь ретиво пробежали мимо нашего с вами внимания?

Давайте прикинем, что у нас есть по части железа между всеми тремя системами. Для этого мне придется вставить изображение, так как блоги StopGame не поддерживают таблицы нативно.

Из нее легко почерпнуть, что хотя фундамент у всех систем общий, однако у Naomi куда выше графическая производительность и минимум в 2-4 раза больше памяти (в два — оперативная и видеопамять и в 4 — память под аудиосэмплы). Atomiswave отличается существенно меньше, но все равно обладает удвоенным объемом видеопамяти и четырехкратно большим количеством памяти под аудиосэмплы. И еще можно заметить, что Atomiswave создавалась компанией Sammy как дешевая альтернатива Naomi. Плюс, не забываем, что загрузка с картриджей всегда работает сильно быстрее, чем с оптического носителя: там где нужно постучаться в банк памяти и попросить данные, уходит сильно меньше времени на результат, чем у механики и оптики привода. Разница порой достигает колоссальных различий, существенно влияющих на плавность прямых, недоработанных портов. Это как если бы ты, дорогой читатель, запустил современную PC-игру на Unreal Engine и начал нон-стоп терпеть компиляцию шейдеров, которые бы не сохранялись в кэш и собирались каждый раз заново. С рандомным падением игры, когда движок ожидает данных, но не получает их вовремя.

А теперь самое интересное: а что если игры для этих аркадных автоматов можно без серьезного ущерба взять и перетащить на железо Dreamcast? Буквально, без шуток, хотя бы с одной из этих двух систем. И как вообще происходил процесс портирования у официальных релизов?

Процессор и графический чип у них абсолютно идентичны. Из-за этого энтузиастам (таким как невероятно крутой мужик Megavolt85) удалось перенести игры с Atomiswave на Dreamcast практически без потери производительности. Важно напомнить, что у Atomiswave при проектировании и производстве увеличили объем видеопамяти (16 МБ против 8 МБ) и звуковой памяти (8 МБ против 2 МБ), а в качестве носителя использовали картриджи вместо дисков GD-ROM.

В итоге, наиболее эффективным решением оказалось переносить код почти один в один, но основательно работать над ассетами и механизмом подгрузки новых данных. Текстуры приходится оптимизировать или немного сжимать, чтобы они поместились в память консоли, это же касается звука.

У обеих систем за звук отвечает один и тот же чип — Yamaha AICA. Поскольку исходного кода игр у разработчиков портов не было, им пришлось модифицировать скомпилированный бинарный код (через ассемблерные хаки), применяя сразу несколько хитростей.

Из стандартных — банальный даунсэмплинг. Дискретизацию аудио переводят, например, из 44.1 кГц в 22 кГц или 11 кГц. В параллель этому часто используется 4-битное сжатие ADPCM, которое аппаратно поддерживается чипом AICA. Это позволяет уменьшить вес файлов в 2–4 раза, чтобы уложиться банками звуков в 2 МБ имеющихся на консоли чипов памяти. А еще в ряде случаев пришлось писать сборщик мусора, чтобы тот бодро вычищал из памяти более неиспользуемые сэмплы.

Но так получается не всегда. В оригинальной Atomiswave из-за избытка памяти разработчики могли позволить себе загрузить в звуковую RAM музыку для нескольких игровых ситуаций разом (например, полевая тема + боссфайт). На Dreamcast это вызывает моментальное переполнение памяти и, как следствие, падение всего кода без возможности восстановления. Выход только один: делать так, чтобы музыка подгружалась кусочками — стримингом.

GDEMU — это небольшая печатная плата, содержащая на себе электронные элементы, формирующие собой эмулятор оптического привода для игровой консоли SEGA Dreamcast. Она заменяет штатный медленный лазерный привод, позволяя запускать игры напрямую с карт памяти формата SD без использования оригинальных компакт-дисков или болванок. Отличается простотой установки (разобрать консоль — снять привод — подставить шлейф — собрать консоль). Из недостатков: поддерживаются только консоли ревизий VA0\VA1. VA2, выпущенные выпущенные в конце 2000-го и в 2001 году не поддерживаются из-за отключенного механизма чтения Mil-CD — мультимедийных компакт-дисков, в коде которых содержится дыра для обхода защиты от копирования приставки .

Но даже с GDEMU при этом есть проблемы: из-за того, что звуковые данные теперь постоянно подгружаются с SD-карты в реальном времени, малейшая задержка чтения приводит к заиканию звука или зависанию ARM-процессора, управляющего чипом AICA. Это то, о чем я говорил выше, когда упоминал разницу между временем чтения данных с картриджа и компакт-диска. Для нормальной работы такой игры в конфигурационном файле GDEMU.ini в корне карты памяти обязательно нужна строка:

image_tests=0​

Она отключает строгие проверки таймингов эмулятора привода, заставляя FPGA (аппаратно-программируемая микросхема, умеющая легко менять логику своих операций с помощью прошивки) этого ODE (Optical Drive Emulator) отдавать аудиоданные игре мгновенно, без микропауз. По сути, как с картриджа — будто бы это всамделишная Sammy AtomisWave.

Как следствие всех проводимых ухищрений для переноса с платформы на платформу, в некоторых играх (например, Dolphin Blue или Metal Slug 6) из-за сильного сжатия звуковых файлов эффектов можно заметить, что взрывы или голоса звучат чуть менее ясно и чисто, чем на аркаде. Однако фоновая музыка благодаря потоковому чтению осталась в великолепном качестве, а сами игры работают на Dreamcast со стопроцентной скоростью и без зависаний - проверено в том числе и мной на моей старой-доброй японской Дримке.

Naomi (New Arcade Operation Machine Idea) разрабатывалась параллельно с Dreamcast как флагманская аркадная платформа. Она архитектурно идентична, но спроектирована с огромным запасом прочности для коммерческого использования.

Сразу вспоминаем: у «старшей сестрицы» Naomi 32 МБ основной памяти против 16 МБ у Dreamcast. Это позволяет сразу загружать в память огромные уровни целиком и куда большее количество анимаций — все это одновременно. И, хотя графический чип относится к тому же семейству PowerVR2, версия Elan в Naomi работает куда эффективнее и имеет более высокую пропускную способность. Кроме того, она способна обрабатывать в секунду примерно в два раза больше полигонов, чем ее родственница из Dreamcast. Не забываем еще про то, что Naomi поддерживает объединение нескольких плат в систему (как в игре F355 Challenge) для вывода изображения на несколько экранов — для пущей иммерсии или мультиплеера.

А теперь прикидываем весь пул сложностей. Если порты с Atomiswave работают идеально, то прямые неофициальные порты с Naomi — это огромная редкость. Играм с Naomi критически не хватает 16 МБ оперативной памяти Dreamcast. Поэтому если и существуют порты, то их раз-два и обчелся: Cleopatra Fortune Plus, Monkey Ball (до порта на GameCube). Причем первый делался чуть ли не вайбкодингом («я кодить не умею, но все поручу нейронке»), а я лично такое ну о-о-о-о-очень не одобряю. Вот такая печальная судьба. Мало у кого есть время и силы на то, чтобы убивать тонну сил и времени на портирование без исходников. Это вам не заранее реверс-инженеренную GTA3, ранее перетащенную с мобильных платформ, на DreamCast перетаскивать! И да, если кто вдруг не знал, такой фанатский порт есть и он отлично работает в 15-20 кадров в секунду — я был поражен старанием тех ребят, которые уже успешно затащили на платформу и Vice City, и думают над San Andreas. Если бы «Дримка» не померла как платформа в марте 2001 года, мы бы вполне могли увидеть GTA3\ Vice City на Dreamcast в актуальное время вместе с кучей других актуальных портов культовых франшиз нулевых.

А еще стоит заметить, что я натыкался на обсуждения энтузиастами переноса отдельных ассетов, незадействованных ресурсов и исправлений из аркадных версий в официальные игры Dreamcast (например, для файтингов Capcom vs. SNK 2 или Marvel vs. Capcom 2), чтобы приблизить домашние версии к аркадному оригиналу.

Официально нанятые разработчики, во времена актуальности консоли, тратили месяцы на то, чтобы переписать код, упростить геометрию уровней и\или сжать текстуры (как это было с Crazy Taxi или Marvel vs. Capcom 2. И да, аркадная версия использовала совершенно конского размера звуки и спрайты!), чтобы уместить игру с Naomi в жесткие рамки домашней консоли SEGA.

Вот что пришлось делать разработчикам, ответственным за порты, для того, чтобы игры смогли вменяемо заработать на Dreamcast:

1) Организовать динамический оверлей и поочередную подзагрузку изолированных модулей кода в ОЗУ. Поскольку весь исполняемый файл .bin из Naomi (часто весящий 12-24 МБ) физически не влезает в 16 МБ оперативной памяти Dreamcast вместе с текстурами, программисты перекомпилируют его помодульно: вручную разбивают код игры на изолированные логические куски (оверлеи). В память загружается только базовое ядро игрового движка, а код для конкретных меню, экранов выбора персонажей или кат-сцен подгружается с диска «на лету» и выгружается сразу после использования. С 16 МБ ОЗУ не забалуешь.

2) Организовать агрессивное сжатие текстур и подмену видеопамяти. Текстуры из версии для Naomi переводятся в поддерживаемый чипом PowerVR2 формат сжатия VQ (Vector Quantization). Это позволяет уменьшить вес текстур почти в 4–8 раз при минимальной потере качества. Если этого мало, часть некритичных фоновых текстур заменяется на моноширинные цвета или текстуры меньшего разрешения. В ином ряде случаев текстурам уменьшают детализацию, а также применяется упрощенное цветовое кодирование. И это мы еще не говорим об ограничениях объема носителя, при прочих равных!

3) Дописать сборщик мусора для ОЗУ. Аркадные автоматы никогда не очищали память сколь-нибудь аккуратно — оно просто не нужно при таких объемах памяти. Инженеры по портированию (да и реверс-хакеры тоже) внедряют в бинарники Naomi-игр ассемблерные инъекции, которые принудительно вызывают процедуры очистки памяти от данных и объектов между раундами или при смене экранов, предотвращая зависание/падение кода на Dreamcast от утечек памяти.

4) Организовать перенаправление JVS-команд ввода в Maple-протокол. Этот момент требует пояснения для тех, кто «не в теме». SEGA Naomi общается со своими контроллерами (кнопками, стиками и прочими органами управления игрового автомата) по промышленному аркадному протоколу JVS (JAMMA Video Standard) через специальную плату ввода-вывода.

У Dreamcast управление работает по собственному протоколу Maple Bus, в который «замешаны» как геймпады, так и вставляемые в них карты памяти — VMU. Программисты портов либо заменяют код на аналогичный для Maple, либо пишут программный транслятор (interceptor, перехватчик вызовов) прямо внутри бинарного кода игры, который перехватывает запросы JVS на лету и подменяет их на сигналы стандартного геймпада Dreamcast.

Собственно, как-то так. Сейчас в сети на различных порталах (в том числе и закрытых от внешних глаз, типа retrogamertalk) можно обнаружить не только свежие релизы, выходившие спустя годы после официальной «смерти» платформы, но еще и солидную пачку портов для Dreamcast с разных аркадных (и не только) платформ.

Выше я дал очень базовое, но, надеюсь, понятное представление о том, какая огромная работа (подчас непосильная без исходников) проделывается энтузиастами и наемными рабочими. И это без учета всех подводных камней и особенностей исполнения кода на старых системах, где нет кучи подстраховок от тех же «выстрелов в ногу» при неправильном выделении памяти (и обращении к ней). У современных программистов, в отличие от их коллег из нулевых, существует целая огромная тонна оберток над низкоуровневым кодом, работающим с железом, существенно экономящая силы, время и нервы.

Но цена этих оберток и куч нагороженных абстракций, существенно ускоряющих написание довольно сложного в сумме кода — куда более низкая производительность при проведении расчетов даже при схожих операциях. Если сильно упрощать для обывателя, не уходя в дебри бенчмарков, то почти любая функция, качественно написанная на низкоуровневых языках (типа Ассемблера) будет работать в разы быстрее, чем ее аналог на C++ или C#. Но времязатраты на написание такой функции отличаются минимум от двух-четырех до шестнадцати раз. Бизнес такого не терпит - ему надо результат уже сейчас, а еще лучше - на прошлой неделе.

Однако, это все лирика. Я хочу сказать (в воздух) слова благодарности тем, кто не покладая рук работал над портами для Sammy AtomisWave. Их непосильным трудом и ценой их же сорванных волос, пролитых пота, крови, бессонниц и нервных срывов, у нас есть возможность прикоснуться к играм этой чудесной аркадной платформы с помощью недурных таких портов на живой Dreamcast.

И когда я описывал выше негативные последствия от ломания головы над очень сложной задачей, я нифига не шутил. Каждый разработчик проходит через это. «Smooth sailing» всем тем, кто пишет код, только снится ;)

А у вас еще осталась живая SEGA Dreamcast? Помните, что игры всего семейства консолей должны отлично поддерживаться эмуляторами типа FlyCast.

Открыть оригинал