概要
- 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)