世界を動かす技術を、日本語で。

PSP版「ゴッド・オブ・ウォー」をWebAssemblyに再コンパイルし、ブラウザで実行する

2026年10月7日原文(github.com)

概要

  • PSPゲームをエミュレータなしでブラウザ上で実行する新技術の解説
  • MIPSマシンコードをC++に変換しWebAssemblyで実行
  • PSP OSやグラフィックチップの高レベル再実装による互換性確保
  • God of Warシリーズなどの具体的な動作実績
  • ユーザー自身のゲームイメージ利用と法的注意事項

PSPゲームをエミュレータなしでブラウザ実行

  • MIPSマシンコード を事前に C++へ変換 し、 WebAssembly としてコンパイル
  • PSPの OSやグラフィックチップ を小規模に高レベルで再実装
  • グラフィック描画は WebGL2 を利用
  • God of War: Chains of Olympus が初の動作例
    • ブートからメニュー、カットシーン、戦闘まで動作
    • 60fps での快適な動作、最大4倍の解像度まで対応
    • スマートフォンでは タッチ操作 にも対応
    • 音楽・音声・効果音 も再生可能(ムービーは未対応)
  • God of War: Ghost of Sparta も同様の手順で移植
    • 一部DRMファイルの復号、システムコール対応、ライティング修正のみ追加
    • パフォーマンス調整不要、 55~60fps で動作

技術的仕組み

  • PSPRecomp による静的再コンパイル
    • EBOOT.BIN を解析し、16KiB単位でC++に変換
    • レジスタファイルとPSPのメモリモデル上で動作
    • プロファイルやパッチでWeb向け最適化
  • PSPカーネルの再実装
    • スレッド、セマフォ、イベントフラグ、コールバック等を高レベルで模倣
    • ファイルシステムは HTTP Rangeリクエスト でストリーミング
    • コントローラー、オーディオ出力、セーブデータ、ダイアログ等も再現
    • ゲストタイムはフレーム単位で進行、常に 60Hz を維持
  • グラフィックエンジン(GE)の再現
    • ディスプレイリスト解析、頂点変換、スキニング、ライティング等をCPUで処理
    • バッチ化した三角形・レンダーステートをWebGLへ送信
    • フレームバッファはWebGLのレンダーターゲットとして管理
    • ピクセルフォーマット変換、ステンシル/アルファ、フォグ等もGPUで再現
    • 1~4倍 の解像度に対応
  • PSP同様の2スレッド構成
    • グラフィックとCPUを分離し、 OffscreenCanvas でワーカースレッド上で描画
    • フレーム処理は重い側のスレッドのみコスト計上
  • サウンド
    • 効果音はPSPのボイスシンセサイザー(ADPCM、ADSR)を再現
    • 音楽・音声は ATRAC3+ を FFmpeg でデコード
    • ミックスは AudioWorklet で出力

高速化の工夫と課題

  • 初期は 6fps しか出なかったが、ボトルネック解析で大幅改善
    • フレームバッファのスワップ最適化で8倍高速化
    • タイマーの最適化でフレームあたりのコスト削減
    • FirefoxのWebGLバッファ最適化でパフォーマンス改善
    • ステンシル/アルファ処理は変更領域のみ追跡し描画負荷を低減
    • GEのスレッド分離で重い処理を単独化し効率向上
  • 別タイトル移植時の課題
    • DRM復号や未実装システムコールへの対応
    • ライティングのアルファ値取り扱い修正
    • パフォーマンスは維持

独自ゲームの移植手順

  • git、CMake、Ninja、C++20コンパイラ、Python 3 が必要
  • Linuxで動作確認済み、macOSは未検証
  • ゲーム1本あたり 2GB程度のディスク容量 を想定
  • 手順例
    • リポジトリのクローンとセットアップ
    • PSP_DECRYPTで EBOOT.BIN を復号
    • port.shでISOなどからページ生成
    • serve.shでローカルサーバー起動
  • --native オプションで画像・音声ダンプも可能
  • 市販ディスクの実行ファイルは暗号化されているため復号ツールが必要
  • 他社製ゲームは未対応システムコールやGE機能で停止する可能性あり
  • 必要に応じてコード追加で対応可能

ホスティングと動作環境

  • SharedArrayBuffer 利用のため、 Cross-Origin-Opener-Policy と Cross-Origin-Embedder-Policy が必要
  • scripts/serve.pyで適切なヘッダーとRangeリクエスト対応
  • スマートフォンで試す場合は cloudflared などでトンネルを利用
  • WebGL2未対応ブラウザは自動でシングルスレッドにフォールバック
  • ?threads=0 で強制シングルスレッド、 ?profile でパフォーマンス表示

法的注意事項とライセンス

  • リポジトリには オリジナルコード、PSPRecompパッチ、サードパーティコード のみを含む
  • ゲームデータや実行ファイルは一切含まれない
  • 生成されたC++やWebAssemblyはゲーム所有者のもの
  • 自身が所有するゲームイメージのみ利用可能
  • God of War はSony Interactive Entertainmentの商標
  • 本プロジェクトはSonyやゲーム会社と無関係
  • コードは MITライセンス、一部 LGPL 2.1 (at3_standalone)

Hackerたちの意見

AIがエミュレーションバブルを完全にぶっ壊してるね。もうエミュレーションなんてしてないし、逆にエンジニアリングしてゲームをそのまま移植してる。これは古いゲームの保存にとって素晴らしい時代だよ。あいつらはもうゲームから利益を得てないのに、IPを公開したり、古いゲームを新しい、もっとアクセスしやすいプラットフォームにアップデートしたりしない。だから、こういう開発者たちの仕事には本当に感謝してる。

└

これって逆エンジニアリングして共有するのは技術的に違法じゃないの?すごいけど、大手企業がロビー活動して厳しい法律を作るのが早まる気がする。Claude/Fableがこれを許可してるのは驚きだね。もしかして、彼らを騙してやらせてるのかな?

└

何も起こらないよ。

└

これは古いゲームの保存にとって素晴らしいタイムラインだね。どういうこと?ISOs/ROMsはすでに保存されていて、新しいプラットフォームのエミュレーターでプレイ可能だったよ。

└

ゲームキューブの「大乱闘スマッシュブラザーズ メレー」の同じアイデアに取り組んでるんだ!ブラウザでも動くよ: https://github.com/nikhilunni/melee ポートは約80%完成してるけど、AIとオラクル(Dolphinエミュレーター)を使った完全な機械的なものだよ。

└

正直言うと、これは素晴らしいタイムラインじゃないと思う。AIがみんなを自分だけで何でもやるように仕向けてる気がして、1つ(または2つ)のプロジェクトに集まって貢献することが減ってるのが心配だよ。もしAIを使って1つのデコンパイルに貢献して、できる限り良くして、ゲームについての知識を集めていたら、もっともっと良くなってたと思う。今は、質の悪い、雰囲気だけのポートが山のように出てきてる。

└

これは古いゲームの保存に関する素晴らしいタイムラインだね。でも、保存っていうよりは、基本的にリマスターだよね。オリジナルのゲームからできるだけデータを保存する必要があるし(できれば、オリジナルのソースアセットやソースコードもね)。それに、法的な問題については特に気にしてないけど、アバンダンウェアの概念についてちゃんとした法的定義があればいいな。

└

エミュレーションバブルを壊して、クラックバブルも壊してる感じだね。デヌーボは、最近までかなり成功してた人気のDRMソリューションだけど、AIによってこの1年ほどで何度もクラックされて、会社がその匿名のクラック者を訴えようとしたみたい。

└

ポイントして盛り上がりたい人にはいいけど、実際にゲームをプレイしたり保存したい人には最悪だね。

└

著作権を持ってる会社がこんなに攻撃的だから、AI企業に逆アセンブルの責任を負わせる動きが出てくるんじゃないかな。AI企業がそれを禁断の知識として指定して、モデルを調整してできないようにする可能性もあるよね。

もしかしたら、やっとMacのブラウザでMGSolidサーガがプレイできるようになるかも :)

小さなPSPカーネル。ゲームがPSPのオペレーティングシステムに求めることは、プロファイル/ホストでの高レベルエミュレーションで応答される。だから、これはただのエミュレーターに余計な手順が加わったもの。エミュレーションを最初から正しくするのではなく、ゲーム特有のパッチが必要な悪いエミュレーターで、ゲームと一緒にバイナリにエミュレーターを埋め込んでる。完全にクソだね。

Hacker Newsで議論の続きを見る