新しいファンプロジェクト「bo2-mac」により、ゲームの元のx86マシンコードを事前にARM64コードに変換することで、Call of Duty: Black Ops IIをApple Silicon上でネイティブに実行できるようになりました。実行時にWindowsの呼び出しを翻訳するWineのような従来の互換レイヤーとは異なり、このプロジェクトはゲームを単一のプロセス内でネイティブコードとして実行することを保証し、Apple M1チップ上で毎秒51〜60フレームの動作を実現しています。

Project bo2-macのロゴとApple M1でのパフォーマンス統計
bo2-macプロジェクトはApple Silicon上でネイティブなパフォーマンスを達成し、さまざまなゲームモードで最大60フレーム/秒に達します。github.com

この画像は、プロジェクトの目標とApple M1ハードウェアで達成されたパフォーマンスベンチマークの概要を提供します。

RemillおよびLLVM 17リフターの図
プロジェクトは再コンパイルのためにRemillを使用してx86関数をLLVM IRにリフトします。github.com

この視覚資料は、技術概要で言及されている再コンパイルパイプラインの最初のステップを説明しています。

再コンパイルパイプライン

bo2-macプロジェクトは、キャンペーン、Zombies、マルチプレイヤーの3つのx86 Windows実行ファイルをネイティブARM64コードに変換します。このプロセスには、SHA-256によるSteamビルドの検証、Remillを使用した関数のカタログ化およびLLVM IRへのリフト、ゲストメモリへのアクセスをインライン化するためのIRの「フォールディング」、Win32ランタイムの実装、およびゲストスレッドのコルーチンとしての管理という5つのステップが含まれます。

Apple M1でのパフォーマンス: キャンペーン 51–60 fps; ゾンビ 57–60 fps; マルチプレイヤー 53–60 fps
Apple M1でのパフォーマンスgithub.com

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によって処理されます。

D3D11からMetalレンダラーへの翻訳図
プロジェクトはDirect3D 11のグラフィックス呼び出しをAppleのMetalフレームワークに翻訳するカスタムレイヤーを実装しています。github.com

この図は、グラフィックスおよびランタイムの翻訳セクションで説明されているグラフィックス翻訳メカニズムを解説しています。

その他のシステムコンポーネントもネイティブなmacOSフレームワークに移植されています。XAudio2はCoreAudioにマッピングされ、ビデオはlibvpxを使用してデコードされます。また、このプロジェクトにはDemonwareサービスをシミュレートするローカルレスポンダーが含まれており、インターネット接続なしでゲームがロビーやストレージのリクエストを処理できるようにしています。

技術的なトレードオフと制限

ゲームはネイティブに動作しますが、現在はローカルプレイに限定されています。プロジェクトはゲームのバックエンドをシミュレートするためにローカルレスポンダーに依存しているため、オンラインサービス、LAN、または協力プレイ(co-op)モードはサポートされていません。さらに、Zombiesとマルチプレイヤーの試合ルールは「クリーンルーム」環境でカスタム記述されているため、挙動がオリジナルのゲームとわずかに異なる場合があります。

プロジェクトはハードウェアの制約にも直面しています。開発者は、長時間のセッション中にMacが非常に高温になり、M1チップで111〜116°Cの温度に達したと報告しています。さらに、変換自体は成功しているものの、ゲームは依然としてローカルな体験であり、ユーザーはアプリをビルドするためにオリジナルのSteamコピーを所有している必要があります。