ハイライト
CD PROJEKT RED は『Cyberpunk 2077: Ultimate Edition』を Apple Silicon Mac へ移植する全体の流れを共有しました。Game Porting Toolkit による評価、Metal レンダリングパイプラインの最適化、「For this Mac」プリセットシステム、HDR や空間オーディオといったプラットフォームネイティブ機能を組み合わせ、高品質な macOS ゲーム体験を実現する方法が示されました。
主要内容
ゲーム開発において、『Cyberpunk 2077』ほどの規模を持つ AAA タイトルを新しいプラットフォームへ届けることは、決して簡単ではありません。
Night City は、膨大な NPC トラフィック、リアルタイム交通システム、複雑な AI 挙動、物理シミュレーション、動的ライティングを備えたオープンワールドです。これらすべてのシステムが並列に動き、CPU と GPU の両方に大きな負荷をかけます。さらに、ゲームはレイトレーシングやパストレーシングといった高度なグラフィックスモードにも対応しています。
CD PROJEKT RED がこのゲームを Mac へ持ってくると決めたとき、3 つの核心的な問題に直面しました。
- 視覚的忠実度: ネオンの光、マテリアル表現、全体の雰囲気は『Cyberpunk』の核であり、妥協できません
- 安定した性能: 混雑した通り、高速走行、激しい戦闘など複雑な場面でも滑らかなフレームレートを維持する必要があります
- ネイティブ体験: macOS プラットフォームの特性を十分に活用し、Mac のために作られたゲームだと感じられる必要があります
従来の移植では、多くの試行錯誤と長い性能チューニング期間が必要になりがちでした。Apple の Game Porting Toolkit はこの流れを変えます。ネイティブコードを書き始める前に、Windows 版を macOS 上で評価できるからです。
CD PROJEKT RED はこのツールで重要な問いに素早く答えました。Mac 上で目標の画質を実現できるのか。性能ボトルネックはどこにあるのか。どの領域を優先すべきなのか。
これらのデータをもとに、チームは明確なロードマップを作りました。ネイティブビルド、Metal レンダリングパイプライン、性能最適化、最後にプラットフォーム機能の統合です。
詳細
Game Porting Toolkit による評価フロー
(00:50)
ネイティブ開発を始める前に、CD PROJEKT RED は Game Porting Toolkit の翻訳環境で Windows 版を動かし、重要なデータを収集しました。
- フレーム時間統計: エンジン内プロファイラを使い、比較可能で一貫したデータを取得する
- Metal HUD: シーンイベントとトレースデータを結び付け、シェーダー変換や読み込みなどのイベントを特定する
- エンジン内部分析: スレッドごとに分解し、どの CPU システムがいつ動いているかを理解する
評価の結果、Apple Silicon 上の GPU 性能は期待を上回り、翻訳環境でも基準値として使えることが分かりました。主な課題は CPU 負荷で、特に密度の高いシーンで顕著でした。
翻訳環境に由来するアーティファクトとして、2 つのパターンが特定されました。リアルタイムのシェーダー変換によるフレーム時間の揺れと、オーディオミドルウェアの高い負荷です。これにより、チームはネイティブ実装で何を優先すべきかを把握できました。
Metal レンダリングパイプラインの構築
(09:39)
ネイティブ Metal レンダリングパイプラインの構築は、いくつかの段階に分かれていました。
- ユニットテスト: Metal バックエンドを段階的に構築し、基本出力を慎重に検証する
- 静的シーン: ユニットテストでは十分に覆えない部分、つまりライティングスタック、ポストプロセス効果、シーンレベルの挙動を検証する
- 動的シーン: カメラ移動、ストリーミング、ゲームプレイが本当のエッジケースを明らかにする
- レイトレーシングとパストレーシング: 視覚出力の一貫性を保ちながら性能を最適化する
Metal Shader Converter は重要な役割を果たしました。広い範囲のシェーダーを素早くカバーし、意味のあるシーンを描画できるようにしたからです。ワークフローはループでした。コンバータを統合し、再現可能なシーンを検証し、不一致がある高度なシェーダーを調整し、繰り返します。
MetalFX Upscaling と動的解像度
(12:32)
さまざまな Mac デバイスで性能を伸ばすため、チームは MetalFX Upscaling を使いました。
- 低い内部解像度でレンダリングし、より短い時間で高解像度出力を再構築する
- 重いシーンで、全体的な品質を大きく落とさずに性能余力を得る
- 動的解像度スケーリングを使い、負荷がかかっているときの性能を安定させる
- 時間的アップスケーラとして、激しい動きや VFX の多いシーンでも画像を安定させる
「For this Mac」プリセットシステム
(13:20)
これは Mac 版『Cyberpunk 2077』の中核的な工夫です。「For this Mac」は、デバイスに基づくグラフィックスプリセットシステムです。
- Mac ハードウェアを検出する
- そのデバイスに最適な設定を自動で構成する
- どの対応 Mac を使っていても、初回起動時から安定して楽しめる出発点を提供する
チームは対応する各 Mac デバイスごとに設定を個別調整しました。
- 画像の忠実度を維持する
- 目標 FPS を 30 または 60 に設定する
- MetalFX と動的解像度スケーリングを組み合わせて使う
- 目標 FPS に到達するよう、最小および最大解像度の境界を調整する
- ディスプレイ能力に応じて HDR を有効化する
- 適切なフレームペーシングのために VSync を設定する
NSNotification イベント処理
(18:43)
ゲームをシステムレベルでネイティブに感じさせるため、チームは複数の NSNotification イベントに対応しました。
// ウインドウの遮蔽状態を検出し、レンダリングを一時停止するか判断する
NSWindowDidChangeOcclusionStateNotification
// NSWindow.occlusionState を確認する
// ディスプレイ構成の変化に対応する
NSApplicationDidChangeScreenParametersNotification
// 新しい画面解像度を取得し、ゲームウインドウを更新する
// ウインドウが新しいディスプレイへ移動したときに対応する
NSWindowDidChangeScreenNotification
// 新しいディスプレイの詳細を収集する: Display ID、解像度、ミラーモード、画面名
// カーソル切り替えを管理する
NSWindowDidResignKeyNotification -> システムカーソルを表示し、ゲームカーソルを隠す
NSWindowDidBecomeKeyNotification -> システムカーソルを隠し、ゲームカーソルを表示する
要点:
NSWindowDidChangeOcclusionStateNotificationでゲームがバックグラウンドにあるかを検出し、見えていないときはレンダリングしないことでリソースを節約しますNSApplicationDidChangeScreenParametersNotificationでディスプレイ設定の変化に対応しますNSWindowDidResignKeyNotificationとNSWindowDidBecomeKeyNotificationで、ゲームカーソルとシステムカーソルを切り替えます
HDR 自動キャリブレーション
(23:10)
Apple の Extended Dynamic Range (EDR) パイプラインにより、ゲームは HDR 出力を自動キャリブレーションできます。
// 現在のディスプレイの最大 EDR 値を取得する
float maxEDR = [NSScreen.mainScreen
maximumExtendedDynamicRangeColorComponentValue];
// その値をトーンマッパーへ送る
toneMapper.setMaxHDRValue(maxEDR);
// HDR をデフォルトで有効にすべきか確認する
float potentialEDR = [NSScreen.mainScreen
maximumPotentialExtendedDynamicRangeColorComponentValue];
if (potentialEDR > 2.0f) {
// HDR を有効にする
enableHDR();
}
要点:
maximumExtendedDynamicRangeColorComponentValueは現在の最大 EDR 値を動的に取得します- この値はディスプレイのハードウェア能力やその他の条件に応じて動的に変化します
- この値でトーンマッパーの最大 HDR 出力を駆動し、常に最適な HDR レンダリングを得ます
- 最大潜在 EDR 値が 2.0 を超える場合、XDR ディスプレイでは HDR をデフォルトで有効にします
ヘッドトラッキング対応の空間オーディオ
(24:49)
Apple の空間オーディオ API により、ゲームは AirPods ユーザー向けにヘッドトラッキングを有効にしました。
// AirPods のヘッドトラッキングを有効にする
AVAudioEnvironmentNode *environmentNode = ...;
environmentNode.listenerHeadTrackingEnabled = YES;
要点:
- ゲーム既存の空間オーディオ対応は、オーディオミドルウェアを通じて実装されています
- オーディオミドルウェアは
AVAudioEngineを通じて Apple の空間オーディオ API を実装します listenerHeadTrackingEnabledをtrueに設定するとヘッドトラッキングが有効になります- デフォルトで有効であり、追加設定は不要です
重要な示唆
-
Game Porting Toolkit を評価ツールとして使う ネイティブコードに着手する前に、翻訳環境でゲームを評価します。実現可能性と性能ホットスポットを素早く把握でき、多くの試行錯誤を省けます。
-
「For this Mac」型のスマートプリセットを実装する 初回起動時に複雑なグラフィックス設定メニューをプレイヤーへ突きつけないようにします。ハードウェア能力を検出し、最適なプリセットを自動設定し、すぐ遊べる体験を提供します。
-
EDR と空間オーディオを十分に活用する Apple の HDR ディスプレイと空間オーディオは差別化要素です。EDR 自動キャリブレーションは手動調整の煩雑さをなくし、空間オーディオは没入感を高めます。実装コストは低く、ユーザー体験の向上は明確です。
-
システムイベントに対応する
NSNotificationイベントを処理すると、ゲームはシステムレベルでネイティブに感じられます。ウインドウ遮蔽、ディスプレイ変化、アプリ切り替えといった細部を適切に扱うことで、プレイヤーは作り込みを感じます。 -
MetalFX は性能拡張の鍵 多様なハードウェア構成で動く必要があるゲームにとって、MetalFX Upscaling と動的解像度スケーリングは、画質を大きく犠牲にせず安定した性能を得る有効な手段です。
関連セッション
- Metal の新機能 - Metal レンダリングの性能分析と最適化テクニックを深く学ぶ
- ゲームを Mac へ届ける - Game Porting Toolkit を使ってゲームを評価し、移植する方法を学ぶ
- HDR と高度なディスプレイ機能 - ゲームで高品質な HDR 表示を実現する方法を学ぶ
コメント
GitHub Issues · utterances