新しいファンプロジェクト「bo2-mac」により、ゲームの元のx86マシンコードを事前にARM64コードに変換することで、Call of Duty: Black Ops IIをApple Silicon上でネイティブに実行できるようになりました。実行時にWindowsの呼び出しを翻訳するWineのような従来の互換レイヤーとは異なり、このプロジェクトはゲームを単一のプロセス内でネイティブコードとして実行することを保証し、Apple M1チップ上で毎秒51〜60フレームの動作を実現しています。
この画像は、プロジェクトの目標とApple M1ハードウェアで達成されたパフォーマンスベンチマークの概要を提供します。
この視覚資料は、技術概要で言及されている再コンパイルパイプラインの最初のステップを説明しています。
再コンパイルパイプライン
bo2-macプロジェクトは、キャンペーン、Zombies、マルチプレイヤーの3つのx86 Windows実行ファイルをネイティブARM64コードに変換します。このプロセスには、SHA-256によるSteamビルドの検証、Remillを使用した関数のカタログ化およびLLVM IRへのリフト、ゲストメモリへのアクセスをインライン化するためのIRの「フォールディング」、Win32ランタイムの実装、およびゲストスレッドのコルーチンとしての管理という5つのステップが含まれます。
HN Digestによるグラフ(github.comの報告数値に基づく)。数値はソースの表記通り。
パフォーマンスを維持するために、プロジェクトはリフトされたIRをclang -O2に渡す前に書き換えます。これにより、ゲストの読み取りと書き込みがインライン化され、ロックシーケンスがハードウェアアトミックに変換されることが保証されます。ARMはTotal Store Order (TSO)に準拠していないため、プロジェクトではこれらの操作を管理するために実際のメモリバリアを使用しています。
「WineもJITもありません。ゲームは単一のプロセス内でネイティブコードとして動作します。」
— GitHub - adrbn/bo2-mac: Call of Duty: Black Ops II statically recompiled from 32-bit x86 Windows to native ARM64 macOS:
グラフィックスおよびランタイムの翻訳
ゲームがDirect3D 11に依存しているため、プロジェクトはこれらの呼び出しをAppleのMetalフレームワークに翻訳する偽のCOMレイヤーを実装しています。シェーダーの翻訳は、DXBCシェーダーをMetal互換コードに変換するC++ライブラリであるHLSLccによって処理されます。
この図は、グラフィックスおよびランタイムの翻訳セクションで説明されているグラフィックス翻訳メカニズムを解説しています。
その他のシステムコンポーネントもネイティブなmacOSフレームワークに移植されています。XAudio2はCoreAudioにマッピングされ、ビデオはlibvpxを使用してデコードされます。また、このプロジェクトにはDemonwareサービスをシミュレートするローカルレスポンダーが含まれており、インターネット接続なしでゲームがロビーやストレージのリクエストを処理できるようにしています。
技術的なトレードオフと制限
ゲームはネイティブに動作しますが、現在はローカルプレイに限定されています。プロジェクトはゲームのバックエンドをシミュレートするためにローカルレスポンダーに依存しているため、オンラインサービス、LAN、または協力プレイ(co-op)モードはサポートされていません。さらに、Zombiesとマルチプレイヤーの試合ルールは「クリーンルーム」環境でカスタム記述されているため、挙動がオリジナルのゲームとわずかに異なる場合があります。
プロジェクトはハードウェアの制約にも直面しています。開発者は、長時間のセッション中にMacが非常に高温になり、M1チップで111〜116°Cの温度に達したと報告しています。さらに、変換自体は成功しているものの、ゲームは依然としてローカルな体験であり、ユーザーはアプリをビルドするためにオリジナルのSteamコピーを所有している必要があります。