ハイライト
本セッションでは、今年 Apple がゲーム開発者に向けて提供する一連のアップデートをまとめて紹介します。Game Mode、Sustained Execution Mode、GameSave、Touch Controls、Background Assets、フレーム補間とノイズ除去に対応した MetalFX、そして Metal 4 と新しい Performance HUD が取り上げられています。
主要内容
Apple プラットフォーム上のゲーム開発者は、いつも同じような問題に悩まされてきました。パッケージサイズが大きすぎてユーザーがダウンロード途中で諦めてしまう、Mac で途中まで進めたゲームを iPhone に切り替えるとセーブデータが消えてしまう、iOS 上で 60 fps にチューニングしたものが 10 分も走らせるとサーマルスロットリングで 40 fps まで落ちて体験が破綻する。これらはグラフィックス API の問題ではなく、プラットフォーム基盤の問題です。
今年の WWDC では、Apple がそれらの穴をひとつずつ埋めてきました。Game Mode を有効にすると、info.plist に LSSupportsGameMode キーを 1 つ追加するだけで、ゲームに対してより多くの CPU 時間と低レイテンシな Bluetooth 接続が割り当てられます。Sustained Execution Mode はゲーム起動時から定常状態のパフォーマンスをロックするため、開発者は「プレイヤーが 10 分後にフレームレート低下に直面しないか」を祈る必要がなくなります。GameSave フレームワークは iCloud をベースにセーブデータの同期を行うため、独自にクラウドストレージを構築・運用する必要がありません。Background Assets を使えば、起動時パッケージを「チュートリアルステージ + 残りはバックグラウンドダウンロード」という形に分割し、プレイヤーがタップしてすぐ遊び始められる体験を実現できます。グラフィックス側では Metal 4 が低レイヤ API を引き継ぎ、MetalFX にはフレーム補間とレイトレーシング向けノイズ除去が追加され、Performance HUD は「このフレーム落ちは shader がランタイムコンパイル中だから」というレベルでボトルネックを直接示してくれるようになりました。
詳細
Low Power Mode の監視(04:02)。macOS 26 では、ゲームの消費電力が高い場合に Low Power Mode への切り替えをプレイヤーに促すようになり、プレイヤー側も Game Overlay 上から動的に切り替えられます。ゲーム側では、この状態の変化に能動的に対応する必要があります。
static let NSProcessInfoPowerStateDidChange: NSNotification.Name
var isLowPowerModeEnabled: Bool { get }
ポイント:
NSProcessInfoPowerStateDidChangeは、Low Power Mode のオン / オフが切り替わったときにシステムが配信する通知名です。これをリッスンすれば切り替えイベントを取得できます。isLowPowerModeEnabledはProcessInfoの読み取り専用プロパティで、現在 Low Power Mode かどうかを判定できます。- 通知を受け取った後は、グラフィックスのプリセットを下げる、ポストプロセスエフェクトを無効化する、解像度を下げるといった対応を行い、フレームレートの維持を最優先にすることが推奨されます。
GameSave の導入(12:13)。GameSave フレームワークは iCloud Documents をベースにしており、Mac で保存したセーブデータが iPhone を開いたときに自動で同期されます。導入は 2 ステップで済みます。Xcode で iCloud Documents の capability を有効にし、container entitlement を追加するだけで、残りは API が処理してくれます。
// Objective-C GameSave code sample
#import <GameSave/GameSave.h>
NSString* containerIdentifier = ///… container entitlement string, nil specifies the first in the entitlement array
GSSyncedDirectory* directory = [GSSyncedDirectory openDirectoryForContainerIdentifier:containerIdentifier];
/// Where statusDisplay is an NSWindow or UIWindow where the alert will be anchored to
[directory finishSyncing:statusDisplay completionHandler:^{
}];
GSSyncedDirectoryState* directoryState = [directory directoryState];
switch (directoryState.state) {
case GSSyncStateError:
error = directoryState.error;
break;
default:
NSLog(@"Sync has finished");
}
NSURL* saveURL = directoryState.url;
ポイント:
openDirectoryForContainerIdentifier:は entitlement に記載した iCloud container の識別子を使って同期ディレクトリを開きます。nilを渡すと entitlement 配列の先頭が使われます。戻り値のGSSyncedDirectoryが以降の操作のハンドルになります。finishSyncing:completionHandler:はバックグラウンドで最新のセーブデータを取得します。statusDisplayにはNSWindow/UIWindowを渡せば、進捗表示や競合解決の UI をそのウィンドウにアンカーしてくれるため、開発者が自前で UI を実装する必要はありません。directoryStateで現在の同期状態を取得します。GSSyncStateErrorブランチではネットワークエラーや iCloud 未ログインといった失敗ケースを処理し、それ以外は同期完了として扱えます。directoryState.urlは実際に読み書き可能なセーブデータディレクトリのパスです。ゲームはここからファイルを読み書きするだけでよく、同期・競合・サインアウトの処理はすべてフレームワークが面倒を見てくれます。
パフォーマンスとグラフィックスパイプライン(15:04)。Metal 4 ではコマンドエンコードの CPU オーバーヘッドが下がり、機械学習をレンダリングパイプラインに組み込めるようになりました。MetalFX は今回 3 つの機能が同時に揃いました。空間 / 時間アップサンプリング、中間フレームを生成するフレーム補間、そして「光線本数を減らしても画質を取り戻す」レイトレーシング向けノイズ除去です。CD Projekt Red はこのセットを使い、Cyberpunk 2077 を M4 Max MacBook Pro 上で大幅に高いフレームレートで動作させています。
Performance HUD の新機能 Insights(20:00)。HUD は「shader がランタイムコンパイルされてフレームが落ちている」といった典型的な問題を識別できるようになり、関連ドキュメントへのリンク付きで改善案を提示してくれます。さらに、一定期間のメトリクスを集約してオフラインのパフォーマンスレポートを作成することもできます。ネイティブのゲームはもちろん、Evaluation Environment for Windows Games で動作する移植版でも利用できます。
重要ポイント
-
やること: ゲームの
info.plistにLSSupportsGameMode = trueを追加し、Sustained Execution Mode の entitlement を申請する。- なぜやる価値があるか: 実装コストはほぼゼロですが、プレイヤーはより多くの CPU 時間と安定したフレームレートカーブを得られます。Sustained Execution Mode はパフォーマンスを定常状態にロックするため、QA で計測したフレームレートがそのまま製品出荷時のフレームレートになります。「最初の 5 分は素晴らしいが、その後は熱で崩れる」という事態を避けられます。
- 始め方: Xcode で Game Mode と Sustained Execution の 2 つの capability にチェックを入れ、再ビルドして検証します。
-
やること: 自前のクラウドセーブ実装を GameSave フレームワークに置き換える。
- なぜやる価値があるか: iCloud の同期、競合解決 UI、未ログイン時のフォールバック、デバイス間のリストアといった処理は、自前で実装すれば最低でも 1 か月分のエンジニアリングコストがかかります。GameSave はそれを数行の API にまとめてくれます。小規模チームにとって、これはまさに「プラットフォームの能力でエンジニアリング予算を節約する」典型的なケースです。
- 始め方: まず新しいプロジェクトや独立したモジュール上で
openDirectoryForContainerIdentifier:→finishSyncing:→directoryState.urlを読むという 3 ステップを spike し、2 台のデバイス間でセーブデータが同期できることを確認してから、既存プロジェクトの移行を検討します。
-
やること: ゲームを「チュートリアルパック + Background Assets」の 2 段ダウンロード構成に分割する。
- なぜやる価値があるか: 大規模ゲームの初回パッケージは数 GB に達することも多く、ダウンロード待ちは初日離脱の主要因のひとつです。Managed Background Assets は最大 200 GB の Apple ホスト容量を提供し、TestFlight 上ではメインビルドを再パッケージすることなくコンテンツアップデートを段階的にロールアウトできます。
- 始め方: まずゲームアセットを「起動時必須」と「バックグラウンドダウンロード可能」に分類し、Managed Background Assets API を組み込んだうえで、TestFlight でプレイヤーが第 1 ステージに到達するまでの時間分布を観察します。
-
やること: 開発ビルドに Metal Performance HUD を組み込み、Performance Insights を有効化する。
- なぜやる価値があるか: 従来はフレーム落ちの原因を特定するために Instruments に切り替えてトレースを取る必要がありましたが、HUD は「shader がランタイムコンパイル中」のような高頻度の問題をゲーム画面上で直接指摘し、関連ドキュメントへのリンクも提示してくれます。
- 始め方: dev build では HUD をデフォルトで有効にし、Shader Compiler の項目をオンにしておきます。Insight が出たらオフラインのパフォーマンスレポートを保存しておくと、リグレッション比較に役立ちます。
関連セッション
- Discover Metal 4 — Metal 4 の新しい API、リソース管理、機械学習の入門
- Combine Metal 4 machine learning and graphics — ML 推論をレンダリングパイプラインに組み込み、MetalFX と組み合わせて画質を向上させる
- Engage players with the Apple Games app — 自分のゲームを新しい Games app や Game Overlay に表示させる方法
- Bring your SceneKit project to RealityKit — SceneKit が非推奨になったあと、3D プロジェクトを RealityKit に移行する道筋
コメント
GitHub Issues · utterances