C#でPlayStation 5:ファンがSharpEmuエミュレータを書く方法
モダンなコンソール用のエミュレータを書く作業は、多くの人が純粋なC++の壁と低レベルな魔法を連想するものかもしれません。しかし、SharpEmuプロジェクトの開発者たちは異なる道を選び、.NETを選択しました。これは、x86-64アーキテクチャと特定のグラフィックスAPIを備えた非常に複雑なシステムであるPlayStation 5の話であることを考えると、野心的に聞こえます。
なぜプログラマに別のエミュレータが必要なのか
シーンをフォローしている人なら、ShadPS4について聞いたことがあるでしょう。このプロジェクトはすでにBloodborneやその他のPS4ヒットタイトルの実行で大いに進歩しています。SharpEmuの作者たちはすぐに免責事項を示しています:彼らは競争したり、他の人の作業を複製しようとしているわけではありません。彼らの目標はもっぱらPS5です。
SharpEmuは実験的なプロジェクトです。教育目的と研究のためにゼロから構築されています。開発者たちは単にシステムアーキテクチャを掘り下げ、リバースエンジニアリングすることを楽しんでいます。これは私たちにとって、慣れ親しんだ.NETテクノロジスタックを使用して、モダンなコンソールが「内部で」どのように動作するかを見る珍しい機会です。
今日、プロジェクトは何ができるか
プロジェクトはまだ初期段階です。バイナリをダウンロードして4KでGod of War Ragnarökを実行することは期待しないでください。チームの焦点は特定のゲームの実行ではなく、インフラストラクチャとエミュレーション精度にあります。
それでも、すでに結果があります:
eboot.binファイルと.elfファイルのロード:エミュレータはコンソール実行可能ファイルの構造を正しく解析します。- ネイティブCPU命令の実行。
- メタデータの読み取り:ゲーム名、バージョン、その他のサービス情報。
- システムモジュール(PRX)との作業と部分的なカーネル関数サポート。
- 初期PlayGoシナリオとビデオ出力サポート。
興味深いことに、一部のゲームはすでにAGC(グラフィックスシェーダーエンジン)の初期化段階に到達し、sceVideoOutを呼び出しています。たとえば、Demon's Souls Remakeでは、エミュレータはすでに開発者がVulkanでのレンダリング用にSPIR-Vに変換することを計画しているシェーダーを準備しています。
テクノロジスタックとインスピレーションの源
このようなプロジェクトにC#を選択することは興味深い決定です。最新の.NET(バージョン8以上)は優れたパフォーマンスを提供し、C++よりもメモリやデータ構造の操作が快適なことが多いです。
SharpEmuの作者たちは、同僚の経験に基づいて構築していることを隠していません。いくつかの有名なプロジェクトが彼らのコードとアーキテクチャに影響を与えています:
- Ryujinx:ここからC#での低レベル操作の実装パターンとファイルシステム処理を学びました。
- Kyty:初期のPS5エミュレータの一つで、ネイティブコード実行の教科書として機能しました。
- ShadPS4:現在の世代と前の世代のSonyコンソールアーキテクチャの一般的な原則を理解するのに役立ちました。
現在、主なターゲットプラットフォームはWindowsです。これは初期段階でのデバッグを簡素化します。LinuxとmacOSのサポートは、コードベースが安定してから後で計画されています。
試す方法
内部を覗いたり、さらにはコードでプロジェクトに貢献したい場合は、ビルドは難しくありません。最新の.NET SDKが必要です。
リポジトリをクローンします:
git clone https://github.com/par274/sharpemu.git
プロジェクトをビルドします:
dotnet build
コマンドラインでゲームイメージをを実行するには、PowerShellを使用します:
.\SharpEmu "путь_к_eboot.bin" 2>&1 | Tee-Object -FilePath "log.txt"
このプロジェクトは誰向けか
SharpEmuは今後数年間で主要なゲームクライアントになる可能性は低いでしょう。しかし、次を学びたい人々に最適です:
- C#でのシステムプログラミング。
- JITコンパイラと命令変換がどのように機能するか。
- クローズドプラットフォームのリバースエンジニアリング。
プロジェクトは「クリーン」で学術的です。プロプライエタリなファイルやキーはなく、すべてのテストは作者の個人的なコンソールのダンプで行われています。
SharpEmuは、ハードウェアエミュレーションのような複雑なタスクがモダンな高水準言語でどのように解決されるかを示す素晴らしい例です。今のところ、プロジェクトはむしろエンジニア向けの「サンドボックス」です。PS5でGPUコマンドがどのように送信されるか、またはそのカーネルでタスクスケジューラがどのように機能するか感兴趣なら、ソースコード去看看ください。C++のテンプレート複雑さを解明するよりも、C#のコードを読む方が明らかに簡単です。
リポジトリにあるDiscordコミュニティで更新をフォローできます。そこでは、開発者たちがヘビーゲームのロードの次の段階を通過する進捗状況や成功を頻繁に共有しています。
関連プロジェクト