PS2 в браузере: Gran Turismo 4 и God of War II без эмулятора

PlayStation 2 теперь работает в браузере — без эмулятора. Машинный код Emotion Engine (процессора PS2) транслируется заранее в C++, компилируется в WebAssembly и связывается с переработанной реализацией операционной системы и железа PS2, которая рендерит через WebGPU. Проект под названием ps2-web-recomp опубликован разработчиком Самиром (@snuri00) на GitHub и уже вызвал широкое обсуждение в сообществе.


Что такое статическая рекомпиляция и чем она лучше эмуляции

Традиционный эмулятор интерпретирует инструкции оригинального железа в реальном времени — это дорого по производительности. Статическая рекомпиляция (static recompilation) идёт дальше: она заранее преобразует весь машинный код игры в эквивалентный код для целевой платформы.

ℹ Ключевое отличие
Эмулятор выполняет инструкции PS2 одну за другой во время игры. Статический рекомпилятор переводит их до запуска — в C++, а затем в WebAssembly. Браузер исполняет уже нативный для себя код.

Инструмент eerecomp читает исполняемый файл игры, анализирует граф управления потоком, находит функции и генерирует C++ блоками по 16 КиБ гостевого кода. Рекомпилятор сохраняет все особенности R5900: 128-битные регистры, мультимедийные инструкции, branch delay slots и нестандартную модель плавающей точки без бесконечностей и денормальных чисел с нестандартным округлением.


Gran Turismo 4: первый и самый требовательный тест

Первой игрой стала Gran Turismo 4 — одна из наиболее требовательных на платформе: она активно использует оба векторных процессора, точное поведение плавающей точки для реплеев и тестов на права, а также графические трюки с чтением отрисованных изображений как палитр.

Игра запускается с заставки, проходит через меню и гонки, воспроизводит музыку и звуковые эффекты, а сохранения хранятся в карте памяти прямо в браузере. Гонка держит 50 кадров в секунду в Chrome на встроенной GPU ноутбука при двойном разрешении PS2.

«A race runs at full speed, 50 frames per second for this PAL release… at twice the PS2’s resolution» — из описания проекта


God of War II: второй портированный тайтл

Следом через те же скрипты прошла God of War II. Специфического кода для неё не потребовалось, зато она выявила два бага, которые Gran Turismo 4 никогда не затрагивала: один в рекомпиляторе, другой в тайминге векторного процессора.

Игра теперь воспроизводится с меню через катсцены в бой и держит 60 кадров в секунду в тяжёлых сценах сражений при нативном разрешении PS2 в Chrome. При двойном разрешении — 48–60 fps, ограничение упирается в встроенную GPU ноутбука.


Архитектура проекта


graph TD
    A[ISO-образ диска] --> B[eerecomp: анализ EE-кода]
    B --> C[Генерация C++ кода]
    C --> D[Компиляция в WebAssembly]
    D --> E[Браузер]
    F[Реализация PS2 OS на C++] --> E
    G[WebGPU: Graphics Synthesizer] --> E
    H[AudioWorklet: SPU2 звук] --> E
    I[Интерпретатор IOP R3000] --> E

Ключевые компоненты

Подсистема PS2Реализация в проекте
Emotion Engine CPU (R5900)Статическая рекомпиляция → WebAssembly
Graphics Synthesizer (GS)WebGPU compute shaders, нативные layout’ы
Vector Unit 1Компиляция микропрограмм в SIMD C++, JIT для новых
SPU2 (звук)48 голосов ADPCM + AudioWorklet
I/O Processor (IOP R3000)Интерпретатор + HLE-библиотеки на C++
IPU (видео MPEG-2)Программная реализация декодера
Диск (CD/DVD)HTTP Range requests — только нужные части

Как добиться полной скорости: путь от 3 до 50+ fps

Первый запуск Gran Turismo 4 выдавал лишь 3 кадра в секунду. Вот что изменило ситуацию:

💡 Оптимизации
  • WebGPU вместо software rasterizer + компиляция VU-программ → ~70 fps нативно
  • Батчинг GPU-вызовов: с ~650 до ~80 compute dispatches на кадр
  • Кэш текстур 16 МБ на GPU: снижение трафика данных на ~60%
  • MessageChannel вместо setTimeout: стабилизация частоты кадров (была 40–50, стала ровные 50)

Отдельного внимания заслуживает работа с браузерным планировщиком: вложенные вызовы setTimeout браузер искусственно замедляет до 4 мс. Замена на MessageChannel и перенос эмуляции в Web Worker позволили стабилизировать кадровую частоту.


Как попробовать самому

Никакие игровые данные в репозиторий не включены. Вы приносите образ диска игры, которой владеете, и скрипты репозитория превращают его в готовую веб-страницу на вашей машине. Процесс сборки занимает около трёх с половиной минут на 8-ядерном ноутбуке.

# Пример запуска скрипта портирования
bash port.sh "Gran Turismo 4.iso"
# → Генерирует web-страницу с игрой
⚠ Только легальные копии
Проект работает исключительно с ISO-образами дисков, которыми вы законно владеете. Ни BIOS, ни игровые файлы не включены в репозиторий.

Контекст: волна статических рекомпиляций

Проект является «братом» psp-web-recomp и использует тот же метод. Первой игрой в PSP-версии стала God of War: Chains of Olympus, которая запускается с заставки через меню, катсцены и бой при 60 fps в Chrome и Firefox на ноутбуке при разрешении до четырёхкратного от родного PSP.

Статическая рекомпиляция добралась и до PlayStation 1: PSXRecomp превращает игры PS1 в нативные бинарники или WebAssembly, а Pepsiman Recompiled стал первым реальным доказательством этого подхода.

Тренд очевиден: статическая рекомпиляция последовательно охватывает всё новые платформы — N64, Xbox 360, PSP, PS1, и теперь PS2. Ключевое отличие ps2-web-recomp от предшественников — браузер как целевая платформа без каких-либо плагинов, с полноценным WebGPU-рендерингом и звуком через Web Audio API.

Репозиторий доступен на GitHub: snuri00/ps2-web-recomp — лицензия MIT, язык реализации C++.