WWDC Quick Look 💓 By SwiftGGTeam
Cyberpunk 2077 を Mac に届ける

Cyberpunk 2077 を Mac に届ける

元の動画を見る

ハイライト

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 つの核心的な問題に直面しました。

  1. 視覚的忠実度: ネオンの光、マテリアル表現、全体の雰囲気は『Cyberpunk』の核であり、妥協できません
  2. 安定した性能: 混雑した通り、高速走行、激しい戦闘など複雑な場面でも滑らかなフレームレートを維持する必要があります
  3. ネイティブ体験: 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 レンダリングパイプラインの構築は、いくつかの段階に分かれていました。

  1. ユニットテスト: Metal バックエンドを段階的に構築し、基本出力を慎重に検証する
  2. 静的シーン: ユニットテストでは十分に覆えない部分、つまりライティングスタック、ポストプロセス効果、シーンレベルの挙動を検証する
  3. 動的シーン: カメラ移動、ストリーミング、ゲームプレイが本当のエッジケースを明らかにする
  4. レイトレーシングとパストレーシング: 視覚出力の一貫性を保ちながら性能を最適化する

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 でディスプレイ設定の変化に対応します
  • NSWindowDidResignKeyNotificationNSWindowDidBecomeKeyNotification で、ゲームカーソルとシステムカーソルを切り替えます

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 を実装します
  • listenerHeadTrackingEnabledtrue に設定するとヘッドトラッキングが有効になります
  • デフォルトで有効であり、追加設定は不要です

重要な示唆

  1. Game Porting Toolkit を評価ツールとして使う ネイティブコードに着手する前に、翻訳環境でゲームを評価します。実現可能性と性能ホットスポットを素早く把握でき、多くの試行錯誤を省けます。

  2. 「For this Mac」型のスマートプリセットを実装する 初回起動時に複雑なグラフィックス設定メニューをプレイヤーへ突きつけないようにします。ハードウェア能力を検出し、最適なプリセットを自動設定し、すぐ遊べる体験を提供します。

  3. EDR と空間オーディオを十分に活用する Apple の HDR ディスプレイと空間オーディオは差別化要素です。EDR 自動キャリブレーションは手動調整の煩雑さをなくし、空間オーディオは没入感を高めます。実装コストは低く、ユーザー体験の向上は明確です。

  4. システムイベントに対応する NSNotification イベントを処理すると、ゲームはシステムレベルでネイティブに感じられます。ウインドウ遮蔽、ディスプレイ変化、アプリ切り替えといった細部を適切に扱うことで、プレイヤーは作り込みを感じます。

  5. MetalFX は性能拡張の鍵 多様なハードウェア構成で動く必要があるゲームにとって、MetalFX Upscaling と動的解像度スケーリングは、画質を大きく犠牲にせず安定した性能を得る有効な手段です。

関連セッション

コメント

GitHub Issues · utterances