WWDC Quick Look 💓 By SwiftGGTeam
Port advanced games to Apple platforms

Port advanced games to Apple platforms

元の動画を見る

ハイライト

Game Porting Toolkit 2 は AVX とレイトレーシング評価を追加。Metal Shader Converter が HLSL デバッグ情報を保持。Shader を 1 回コンパイルすれば macOS と iOS にデプロイ可能。


主要内容

Windows AAA ゲームを Mac に移植するには、以前は Shader 書き直し、グラフィックス API 再接続、プラットフォームごとのデバッグ——数ヶ月が当たり前。昨年 Apple は第 1 世代 Game Porting Toolkit(GPTK)を提供。コード変更なしで Apple Silicon 上の性能を評価できる環境だが、AVX なし、レイトレーシングなし、互換性と性能も最終移植版と差があった。Ubisoft は GPTK で『Assassin’s Creed Mirage』の Shader を Metal に移し数ヶ月短縮したが、依然として大量の手作業が残った。

GPTK 2 は 3 点を改善。第一、評価環境の能力補完:AVX 命令セット、レイトレーシング、グラフィックス/コンピュート互換性向上、性能が移植後に近づく——評価段階のフレームレートで最終体験をより正確に予測。第二、Shader ツールチェーンのデバッグループ完成:Metal Shader Converter が HLSL ソースのデバッグ情報を Metal ライブラリへ。Xcode の Shader Debugger と Shader Profiler が元 HLSL でブレークポイント、変数確認、ホットスポット特定——評価環境の Windows バイナリ実行時も Metal 版デバッグ時も。第三、マルチデバイス展開が 2 回コンパイルから 1 回へ:Unified Metal Shaders で MetalIR に 1 回コンパイル、macOS/iOS 共通。Metal Device 初期化 API 統一。Device Certification API でデバイス性能段階に応じた画質調整。

移植フローは 3 段階:評価(コード変更なしで Windows バイナリ実行)、移植(サンプルコードプロジェクトで Xcode 工程構築)、デバッグ最適化(Metal ツール全工程利用可能)。GPTK 2 には完全な 2D ゲーム Xcode プロジェクト付属——グラフィックス、Shader、オーディオ、コントローラー入力、Cloud Saves など。build & run 可能、必要モジュールだけ抽出も可。


詳細

評価環境:まず動かしてから着手

評価環境は GPTK の入口。Windows ゲーム実行ファイルを評価環境に入れると Apple Silicon 上で互換レイヤー経由実行。ベースライン性能と Shader 変換結果を取得。今年のアップグレード:

  • AVX 命令セットサポート:以前 AVX 使用 Windows ゲームは評価不可。今は可能(02:37)。
  • レイトレーシングサポート:評価環境で DXR ゲーム実行可能(02:44)。
  • 性能向上:グラフィックス/コンピュート互換性改善。フレームレートが最終移植版に近づく(02:51)。

コミュニティは GPTK ベースで Whisky、Homebrew などのラッパー。CrossOver も評価環境を統合。

プロジェクト設定:1 工程で macOS と iOS

Xcode プロジェクトは macOS と iOS を同時ターゲット可能。ゲームコードの大半は共有。「Always Used」フィルターで十分。アプリライフサイクルとプラットフォーム固有 API のみ target conditional や SDK フィルターで区別(06:22)。

今年の重要な統一 API:

  • Unified Metal Shaders:1 回コンパイル、macOS/iOS デプロイ(07:56)。
  • Metal Device 初期化統一:両プラットフォーム同一作成 API(08:03)。
  • Device Certification API:デバイス性能段階を照会、動的画質調整(08:09)。
  • Game Mode が iOS に:Info.plist に GCSupportsGameMode = true で有効。iOS はバックグラウンド活動を減らし Bluetooth 遅延を低減(08:17)。

Metal Shader Converter:HLSL から Metal への架け橋

Metal Shader Converter はレイトレーシングと Mesh Shader を含む全 Shader ステージ、従来の Geometry/Tessellation もサポート(09:34)。resource layout を Metal に移植し、header-only runtime でリソースバインドと共通タスク。

今年 2 つの重要更新:

  • Globally-coherent texture access:スレッドグループ間で可視なテクスチャ操作が必要な高度アルゴリズム向け(10:29)。
  • デバッグ情報伝達:DXC コンパイル時に -Zi -Qembed_debug。Converter がデバッグ情報を Metal ライブラリへ。Xcode ツールが元 HLSL を直接デバッグ(22:34)。

CLI または動的ライブラリで Converter 呼び出し。Windows/macOS 両対応。

Residency Sets:GPU リソース常駐管理の簡素化

Apple プラットフォームは統一メモリモデル。GPU は大量メモリにアクセス可能だが、Metal にどのリソースを常駐させるか明示が必要。以前は 1 つずつ追跡。今年 Residency Sets で一括管理(11:58)。

// Build a residency set.

// Create a new residency set.
MTL::ResidencySet* residencySet;
residencySet = device->newResidencySet(residencySetDescriptor, &error);

// Add to main command queue.
commandQueue->addResidencySet(residencySet);

// Add allocations and commit changes.
residencySet->addAllocation(texture);
residencySet->addAllocation(buffer);
residencySet->addAllocation(heap);
residencySet->commit();

// Use residency sets.

// Allocate and encode a command buffer.
MTL::CommandBuffer* commandBuffer = commandQueue->commandBuffer();

// ...

// The command queue marks residency for the set for this command buffer.
commandBuffer->commit();

キーポイント:

  • newResidencySet で Metal Device から常駐セット作成。descriptor と error ポインタを渡す(12:51)。
  • addResidencySet で command queue に常駐セットをバインド。その queue 上の全 command buffer が自動的に常駐をマーク。
  • addAllocation で texture、buffer、heap 全体を追加。1 回 commit で有効。
  • 設定は 1 回(リソース追加/削除時)。描画時は通常どおり command buffer をエンコード。commit 時に常駐セットを継承。

レイトレーシングに特に有用——シーン全リソースを 1 常駐セットに入れ、一括常駐マーク。

MetalFX:Temporal Scaler に Reactive Mask 追加

MetalFX は低解像度レンダリング + アップサンプリングでフレームレート向上。Temporal Scaler は時間情報を蓄積。今年 reactive mask オプション追加(15:00)。

// Upscale image with MetalFX.

mfxTemporalScaler->setColorTexture(currentFrameColor);
mfxTemporalScaler->setDepthTexture(currentFrameDepth);
mfxTemporalScaler->setMotionTexture(currentFrameMotion);
mfxTemporalScaler->setOutputTexture(currentFrameUpscaledColor);

mfxTemporalScaler->setJitterOffsetX(currentFrameJitter.x);
mfxTemporalScaler->setJitterOffsetY(currentFrameJitter.y);

mfxTemporalScaler->setReactiveMaskTexture(currentFrameReactiveMask);

mfxTemporalScaler->encodeToCommandBuffer(commandBuffer);

キーポイント:

  • color、depth、motion の 3 入力テクスチャと 1 出力テクスチャを設定(14:46)。
  • Jitter offset は時間蓄積アライメント用のサブピクセルオフセット。
  • setReactiveMaskTexture は今年追加のオプション。alpha blending の高速移動物体——運動情報が不正確。reactive mask でこの種シーンのアップサンプル品質向上。
  • 最後に encodeToCommandBuffer でアップサンプル pass を command buffer にエンコード。

Cloud Saves:デバイス間セーブ同期

GPTK 2 サンプルは CloudKit セーブ同期を封装した CloudSaveManager クラスを提供(19:33)。

// Use the cloud save manager.

CloudSaveManager* cloudSaveManager =
    [[CloudSaveManager alloc] initWithCloudIdentifier:@"iCloud.com.mycompany.mygame"
                              saveDirectoryURL:[NSURL fileURLWithPath:@"/path/to/saves"]];

[cloudSaveManager syncWithCompletionHandler:^(BOOL conflictDetected, NSError *error) {
    // Handle conflicts or errors, for example, by presenting a choice.
}];

// Access and write saves
[cloudSaveManager uploadWithCompletionHandler:^(BOOL conflictDetected, NSError *error) {
    // Handle errors and conflicts or delay until the next sync.
}];

キーポイント:

  • initWithCloudIdentifier で iCloud コンテナ ID とローカルセーブディレクトリ URL(19:53)。
  • syncWithCompletionHandler をゲーム起動時に呼び、クラウドセーブを取得してローカルとマージ。completion で競合処理。
  • uploadWithCompletionHandler をセーブファイル書き込み後に呼び、変更を iCloud へプッシュ。

Metal ツール:HLSL デバッグ全工程

Metal ツール最大の変化は HLSL ソースデバッグ対応。準備は簡単:DXC で HLSL コンパイル時に -Zi -Qembed_debug。Converter がデバッグ情報を Metal ライブラリへ自動伝達(22:34)。

3 つの重要ツール:

  1. Runtime Validation:API Validation は Metal API 呼び出し合法性をチェック(極軽量、常時 ON)。Shader Validation は Shader 内の未定義動作をチェック。今年テクスチャ型不一致検出追加——変換後 Shader へのテクスチャバインドでよくあるエラー(22:58)。pipeline 単位で Shader Validation の ON/OFF も可能。
  2. Shader Debugger:各行の変数値。左 Debug Navigator に実行履歴。右に変数プレビュー。クリックで近傍ピクセル値と実行マスク(24:52)。
  3. Shader Profiler:Shader Cost Graph で最も時間のかかる関数呼び出し。ソース行レベル性能統計。Performance Heat Map で高コストピクセルを可視化。ピクセル選択で SIMD グループ履歴とコールスタック(25:48)。

評価環境の Windows バイナリ実行時も Metal 版デバッグ時も全ツール利用可能。


重要ポイント

  1. Residency Sets でレイトレーシングシーンリソースを管理

    • なぜ価値があるか:テクスチャとバッファの常駐を 1 つずつ追跡すると漏れや CPU オーバーヘッド。Residency Sets は 1 回 commit で全部——コード簡潔、CPU overhead 低減。
    • 始め方:シーン全 texture、buffer、heap を同一 ResidencySet に追加。command queue にバインド。以降 command buffer commit で常駐継承。
  2. MetalFX Temporal Scaler + Reactive Mask でフレームレート向上

    • なぜ価値があるか:低解像度レンダリング + アップサンプリングは標準手法。reactive mask は alpha blending シーンで運動情報不正確によるブレを解決。
    • 始め方:レンダリングパイプラインに MetalFX temporal scaler pass を挿入。alpha blending 高速物体用 reactive mask テクスチャ生成。setReactiveMaskTexture で渡す。
  3. CloudKit でデバイス間セーブ同期

    • なぜ価値があるか:自宅 Mac、通勤 iPhone、カフェ iPad——セーブ非連携は体験を断ち切る。CloudKit は Apple エコシステム内で最も直接的な同期。
    • 始め方:サンプルの CloudSaveManager 参照。起動時 sync、書き込み後 upload。completion で競合処理。
  4. DXC に -Zi -Qembed_debug で Metal ツールが HLSL を直接デバッグ

    • なぜ価値があるか:移植中の Shader バグは最も特定困難。Xcode で元 HLSL の変数値と実行パスを見れば 2 ツールチェーン間の往復が不要。
    • 始め方:HLSL コンパイルスクリプトの DXC に -Zi -Qembed_debug 追加。再コンパイル後 Shader Debugger/Profiler で HLSL ソース表示。

関連セッション

コメント

GitHub Issues · utterances