ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Appleプラットフォームへの高度なゲームのポーティング
Appleプラットフォームでは、全世界のプレイヤーに簡単にリーチできます。Appleシリコン上でWindows実行可能ファイルを評価する方法、サンプルコードを利用してゲームのポーティングを開始する方法、シェーダコードをMetal向けに変換する方法、ゲームをMac、iPhone、iPadに展開する方法を学びましょう。HLSLシェーダを理解する高度なMetalツールを使用し、ポーティングされたシェーダをMetal上で検証、デバッグ、プロファイルする方法もご紹介します。
関連する章
- 0:00 - Intro
- 2:06 - Evaluate your game
- 2:07 - Port your game
- 6:22 - Configuration
- 9:29 - Shaders
- 11:36 - Graphics
- 16:06 - Input and rumble
- 17:56 - Audio
- 18:53 - Cloud saves
- 21:28 - Debug and profile with Metal tools
- 28:39 - Wrap-up
リソース
- Download the Game Porting Toolkit 2
- Forum: Graphics & Games
- Get started with Metal shader converter
- Getting started with Metal-cpp
- Metal
- Metal Developer Resources
- Rendering reflections in real time using ray tracing
- Simplifying GPU Resource Management with Residency Sets
- Validating your app’s Metal API usage
- Validating your app’s Metal shader usage
関連ビデオ
WWDC24
Tech Talks
WWDC23
WWDC22
WWDC21
WWDC20
WWDC19
-
ダウンロード
こんにちは Jacek Ratajewskiです Appleの エンジニアリングマネージャーであり Graphics, and Display Software グループの所属です 本セッションでは Alèと一緒に 高度なゲームをMac iPad iPhoneに ポーティングする方法をご紹介します
昨年 Metalに Game Porting Toolkitが導入され ほかのプラットフォームからMacへの 高度なゲームのポーティングが 飛躍的に容易になりました 「Death Stranding Director's Cut」 などのゲームが Mシリーズチップ搭載のすべての iPadとiPhone 15 Proで プレイ可能になりました 新しいGame Porting Toolkit 2には 高度なゲームを迅速にMacにポーティングし iPadやiPhoneでプレイできるようにする 更新されたツールセットが用意されています Windowsで実行されるゲームを すでに開発済みの方は ポーティングのプロセスの出発点として キットに付属するWindowsゲーム用の 評価環境をご使用ください ゲームをAppleシリコンで 実行する方法を学ぶことができます 次に ヒューマンインターフェイスガイドラインは Appleデバイスに固有のデザインの 基本ルールを導入する上で役立ちます 計画フェーズが終わったら ゲームポーティングのサンプルコードを 参照しましょう プロジェクトをセットアップし ゲームポーティングのベストプラクティスを 習得するための 最適な出発点となります C++でのプログラミングに慣れている場合 Metal-cppを使用すると 開発に使うプログラミング言語を より自由に選択できます 現在HLSLで実装されたシェーダを ゲームで使用している場合は Metalシェーダコンバータを使えば それらのシェーダをMetalで利用できます 最後に 既存のアセット構築 パイプラインを使っている場合 Windows向け Metalデベロッパツールを利用すれば Appleデバイス上のゲームで そのパイプラインを活用できます 本セッションでは ゲームのポーティングの プロセスについて説明します まず ゲームの評価について説明します 次に 新しいGame Porting Toolkitを 使用して 既存のゲームのコードとアセットを 移行する方法をご紹介します 最後に ポーティングプロセスの各ステップで Metalツールを活用して コードのデバッグと プロファイリングを行う方法を説明します 最初のステップとして ほかのプラットフォーム向けのゲームが すでにある場合は Windowsゲームの評価環境を 使用することで ポーティングプロセスを開始する前に Appleシリコンで実行する場合の ゲームの動作を確認できます これにより ベースラインの パフォーマンスをより正確に把握し シェーダがMetal向けに 正常に変換されたことを確認できます 画面では 505 Gamesの「Control」を 評価環境を利用して MacBook Proで実行しています
今年更新されたツールの最新版では サポート対象のゲーム技術が増えています AVX命令を使用している Windowsゲームを Appleデバイスにポーティングする前に 評価できるようになりました レイトレーシングも 評価環境でサポートされるようになりました グラフィックスとコンピューティングの 互換性が向上し パフォーマンスも向上したため Appleデバイスでの ゲームのパフォーマンスを より正確に把握できます また Xcode内で使用できる Metalツールが新たに改良されたため ポーティングプロセスのどの段階でも 元のHLSLシェーダの ソースをデバッグして プロファイリングできるようになりました このツールは 元のWindowsバイナリを 評価する場合も ゲームのMetalバージョンを デバッグする場合も利用できます また喜ばしいことに コミュニティでこのツールの導入が進み WhiskyやHomebrewなどの プロジェクトや CrossOverなどの製品を通じて 既存のゲームの評価を開始するための 新しい方法が提供されています
MacやiPadやiPhoneでゲームをプレイする ユーザーは 慣れ親しんだAppleプラットフォームの 基本ルールが踏襲されることを期待します ゲームのポーティング時に留意しておくべき ユーザー体験の各側面を解説する ビデオがあります 「Design advanced games for Apple platforms」です また Game Porting Toolkitについては ヒューマンインターフェイスガイドラインの ゲーム向けの新しいセクションにも 解説があります 初回起動時の体験を向上させる方法や すべてのAppleディスプレイのサイズで フォントを読みやすくする方法などの トピックに関するヒントが記載されています これでゲームのポーティングを開始する 準備が整いました 適切なプロジェクト構成により MacやiPad iPhoneへの ポーティングが可能になります Game Porting Toolkit 2には この目標を達成する上で役立つ 優れた新しいサンプルコードがあります サンプルはインタラクティブな チュートリアルで構成されており ポーティングプロセスの主な要素が 順を追って説明されています プロジェクトのレイアウトでは ドキュメントがフォルダに整理され ゲームのサブシステムの ポーティングに関する具体的な情報が グラフィックス シェーダ オーディオ ゲームコントローラなどのフォルダにあります 各フォルダには レッスンと それに関連するすべてのコードが含まれます 例えば 「GameInput」のフォルダを開くと このプロジェクトの ゲームコントローラの入力を処理する すべてのファイルを Xcodeで表示できます READMEファイルには ゲーム入力のサポートを ゲームに組み込む方法を理解する上で 必要な情報がすべて含まれています
必要なもののみに絞って情報を取得し 学習中にコードサンプルを すぐに参照できる優れたキット構成です 何よりも素晴らしいのは 包括的なXcodeプロジェクトであるため ビルドし実行すれば 全体がどのように 連動し機能しているか確認できる点です この簡素な2Dゲームは プロジェクト内の複数のブロックに分かれた 大量のコードで構成されており それらすべてのテクノロジーが 連動して機能している例です デベロッパはこれを変更し 様々なことを試し 一部を自身のプロジェクトに 使用することさえできます
また macOSとiOSのそれぞれに ポーティングするための すべての構成がすでに含まれているため iPhoneやiPad向けのゲームを 簡単に構築して実行できます このサンプルコードは Appleデバイスへの ゲームのポーティングを開始する 優れた出発点です
ここからは Alèが ゲームのポーティング方法について 詳しく説明します ご紹介ありがとう Alèです AppleのMetal Games Ecosystemチームのエンジニアです 私からは ゲームポーティングの コードサンプルプロジェクトの 重要な領域をご紹介します まず macOSとiOSの両方を対象として プロジェクトを構成する方法を説明します 次に シェーダとグラフィックスを Metalで利用する方法を解説します また 振動やオーディオなどの 入力サポートについて説明し 最後に クラウドセーブにより シームレスなゲーム体験を 場所を問わずマルチデバイスで提供して プレイヤーの満足度を高めるための ヒントをご紹介します
Xcodeプロジェクトを 適切に構成することで ゲームをmacOSにポーティングし iOSでのビルドと実行をワンステップで 行うための準備を整えられます Xcodeを使えば すべてのAppleデバイスを 統一された方法で移行のターゲットにしつつ 必要に応じてカスタマイズもできます ゲームでは通常 すべてのプラットフォームで 共通のコードベースを使用し プロジェクト設定の大半を共有するため この方法が最適です
このゲームポーティングのサンプルは マルチデバイスプロジェクトの設定の例です このサンプルでは macOSとiOSの 両方のデバイスがターゲットです この情報は プロジェクトの設定の にあります この設定により macOSとiOSの両方で それぞれのSDKのすべての機能を 利用できるようになります
必要に応じて Xcodeでは ライブラリ フレームワーク コードの一部など 各要素をターゲットごとに 簡単に区別できます iOSとmacOSのターゲット条件を使うと ファイルの一部をいずれかのOS用に コンパイルできます さらに ターゲットの片方のみに合わせて カスタマイズしたすべてのファイルを プロジェクトに含めることもできます 例えば アプリライフサイクルのファイルを macOSとiOSで別にできます この場合 Xcodeではフィルタを使用して SDKに基づいて 特定の ターゲットのファイルを指定できますが 共有されるファイルが多い場合 すべての場所でそれらを使用するために フィルタを適用します ゲーム開発に使用する Appleフレームワークの大部分は macOSとiOSの両方を対象としています これにより両方の開発が 非常に簡単になっていますが 今年の新しい機能強化により 開発がさらに容易になりました 統合されたMetalシェーダでは シェーダを1回コンパイルすれば macOSとiOSの両方に展開できます Metalデバイスの初期化も 統合されているため 両方に同じ Creation APIを使用できます デバイスのCertification APIを 使用すると デバイスのパフォーマンスプロファイルの クエリにより ゲームの構成を拡大/縮小できます 今年のもう一つの機能強化は iOSへのゲームモードの導入です ゲームモードでは iOSはバックグラウンドアクティビティと Bluetoothの遅延を抑制し 入力とヘッドフォンの応答性を向上させます
iOS 18では ゲームモードが 自動的に有効になる場合がありますが 確実に有効にしたい場合は GCSupportsGameModeキーを iOSのinfo.plistで追加し trueに設定します ゲームポーティングのサンプルコードで これらの主な構成手順を確認できるので 詳しくはこちらをご覧ください プロジェクトの構成について もう一つ詳細を説明します C++はゲーム開発でよく使用される プログラミング言語です みなさんもゲーム開発で すでにお使いかもしれません みなさんのC++の専門知識を どのように活用できるかわかるように ゲームポーティングのサンプルコードには Metalの公式C++バインディングである Metal-cppが事前構成されています Metal-cppは Game Porting Toolkit 2に 今年導入されました C++の構文にすでに慣れている方は Metalを 簡単に使い始めることができます 最大のメリットは Metal Objective-C ヘッダの 呼び出しとは異なり オーバーヘッドが極めて小さいことです 詳細については developer.apple.comのドキュメントと WWDC22のビデオをご覧ください プロジェクトの構成の説明は以上です 次はシェーダの導入です Game Porting Toolkit 2には Metalシェーダコンバータが含まれています そのため Metalでのシェーダの利用を スムーズに始められます レイトレーシングやメッシュシェーダなどの 最先端のものから ジオメトリやテッセレーションシェーダ などの従来のテクノロジーまで あらゆるレベルのシェーダを サポートしています Metalシェーダコンバータにより ポーティングの所要時間が 大幅に短縮されます UbisoftはGame Porting Toolkitの Metalシェーダコンバータを使用して 「Assassin's Creed Mirage」の シェーダをMetalに導入し 開発期間を数か月短縮しました Metalシェーダコンバータは シェーダの導入に加え リソースレイアウトの Metalへのポーティングにも利用できます また ヘッダのみの ランタイムライブラリが含まれており リソースをパイプラインにバインドして 一般的なタスクを実行する上で役立ちます Metalシェーダコンバータの詳細については developer.apple.comのドキュメントと WWDC23のビデオ 「Bring your game to Mac, Part 2: Compile your shaders」をご覧ください
今年 グローバルに一貫性のある テクスチャアクセスがMetalに導入され 更新されたMetalシェーダコンバータは これをフルサポートしています これにより すべてのスレッドグループで テクスチャの操作を確認できる必要のある 高度なアルゴリズムを開発できます さらに Metalシェーダコンバータが ソースHLSLからのデバッグ情報を理解して 伝達できるようになったため 変換されたシェーダのデバッグと プロファイリングに Metalツールの機能を 最大限に活用できます 最後の点として 今年から シェーダをMetalIRに一度変換するだけで すべてのAppleデバイスに 展開可能になりました
ゲームポーティングの サンプルプロジェクトでは Metalシェーダコンバータの活用方法と 統合されたシェーダを一度コンパイルした後 macOSとiOSの両方に 展開する方法を確認できます Metalシェーダコンバータは WindowsとmacOSの両方で コマンドラインツールから呼び出すことも 動的ライブラリにリンクして 呼び出すこともできます
このゲームサンプルでは 簡略化のために コマンドラインツールを使用しており 入力と出力のファイルを直接指定しています metal-shaderconverter --help を実行すると シェーダ変換の 豊富なオプションの詳細を確認できます シェーダをプラットフォームに展開したら グラフィックスのレンダリングを開始します Metalによるレンダリングでは Appleデバイス向けに設計され最適化された 最新のグラフィックスと コンピューティングのAPIを利用できます 幅広い高度な機能を提供しているので Metalのドキュメントで 詳細をご確認ください 今年 Metalに ゲームに特化した機能強化が導入されます その筆頭がリソース常駐です ほかのプラットフォームでは GPUのメモリは各々に個別で制限があります ゲームでは リソースが個別のメモリにコピーされ ゲームの効率的なメモリアクセスは メモリサイズが制限内の場合のみ可能です Appleプラットフォームでは ユニファイドメモリモデルにより GPUは大規模メモリにアクセスできます ただし それらにアクセスするために 常駐させるのは どのリソースかを Metalに伝える必要があります このプロセスを簡素化し より簡単に ほかの プラットフォームから移行できるよう 今年 Metal Residency(常駐)セットを 導入します
ゲームのリソースを ユニファイドメモリに読み込み CPUとGPUがそれを共有します Residencyセットを使用すると リソースのグループを定義し 全グループを 一度に常駐させることができます
Residencyセットを使用すれば 個々のリソースのトラッキングが 不要になるため コードが簡素化され CPUのオーバーヘッドが削減されます Residencyセットの使用方法は簡単です まず 新しいMetal Residencyセット インスタンスを Metalデバイスから作成します 次に Residencyセットを コマンドキューに追加することで キューにタスクをコミットすると セット内の全リソースに 常駐フラグが自動的に 設定されるようになります Residencyセットを 個々のコマンドバッファに 関連づけることもできます 次に テクスチャやバッファ さらにはヒープ全体など ゲームに必要な割り当てを追加します
完了したら 変更をResidencyセットに コミットします セットアップ手順は リソースを 作成または削除する時に一度だけ実行します 描画時に Residencyセットを関連づけたキューから 通常通り コマンドバッファに タスクをエンコードします そして コマンドバッファをコミットすると Residencyセットが継承され 割り当てをGPUが 利用できるようになります 詳細については ドキュメントや 更新された「Rendering reflections in real time using ray tracing」の コードサンプルと ゲームポーティングの サンプルコードをご覧ください Residencyセットは Metalの レイトレーシングの導入を大幅に簡素化します レイトレーシングされた すべてのシーンリソースを セットの一部である常駐リソースとして マークできるようになるためです Metalには今年 ほかのプラットフォームからの レイトレーシング導入の支援のための 改善も行われています アクセラレーション構造の変換行列を 行優先の順序で指定できるようになりました これにより 実行時に生じる 転置のコストを節約できます また オンチップの交差結果のストレージに 直接アクセスすることで パフォーマンスが向上します レイトレーシングシェーダ関数の間で 引数を渡す際の データコピーやGPUメモリの 潜在的な流出が回避されるためです レンダラが美しい画像を生成したら MetalFXを使用することで ゲームのパフォーマンスを 大幅に向上させることができます MetalFXは低解像度の画像を ターゲットの出力解像度まで スケーリングすることで機能します 処理時間は 同じ出力解像度で 直接レンダリングするよりも短くなります MetalFXの使用方法は簡単です テンポラルスケーラオブジェクトを レンダリングループで作成した後は 色 奥行き モーションや アップスケールされた出力の テクスチャを指定する必要があり ジッターオフセットの提供も必要です 今年 新しいリアクティブマスクが 追加されます このオプション機能を使用すると 不正確なモーション情報を持つ 動きの速いオブジェクトを含むシーンなどで アップスケーリングの忠実度を高められます アルファブレンディング使用時などに 有効です
最後に アップスケーリングパスを コマンドバッファにエンコードします これでテンポラルMetalFXアップスケーラの 準備が整いました
Metalが提供する 高度なグラフィックス機能と コンピューティング機能は このビデオで紹介しきれないほどです Metalを使った高度なレンダラの ポーティングの実用的な例は ゲームポーティングの サンプルプロジェクトと WWDC23のビデオ 「Bring your game to Mac, Part 3: Render with Metal」をご覧ください GPUのプログラミングは楽しいですが プレイヤーに 美しい世界を体験してもらうには 画面に表示する必要があります
デバイスのジオメトリに適応する 全画面とウインドウの両方のモードを Appleフレームワークを使って 効率的に実装する方法を ゲームポーティングの サンプルプロジェクトで確認できます おすすめのビデオもあります 「Design advanced games for Apple platforms」です Appleデバイスのプレイヤー向けのゲームの 優れたデザインガイドラインを確認できます ゲームはグラフィックスだけではありません ほかのゲームサブシステムのポーティングは レンダリング同様に簡単です まず 入力と振動について説明します 入力には様々な形式があります macOSとiOSのデバイスの共通点として ゲームは コントローラや マウス キーボードからの プレイヤーのアクションを感知して 応答することができます さらに iOSデバイスは 最大10本の指のタッチを同時に認識し よりパーソナルな体験を生み出します Game Controllerフレームワークは 統合されたソリューションです イベントコールバックの登録と プレイヤーのアクションの オンデマンドでのポーリングの 両方に対応する モダンで柔軟な設計を備えています このフレームワークはすべてのデバイスでの プレイヤー入力取得の推奨方法です
入力コードのポーティングの容易さを ゲームポーティングの サンプルプロジェクトで実感できます 現在のコードでゲームコントローラの状態を 直接ポーリングしている場合などは Game Controllerフレームワークを 使用して ポーリングすることもできます Game Controllerフレームワークを 使えば プレイヤーがゲームコントローラを まったく接続していない場合でも 安全に呼び出しできる より短くてクリーンなコードを作成できます
しかし入力は 感知の全体をなす要素のうち 半分にすぎません プレイヤーにイマーシブ感を提供する上で 鍵となるのは ゲーム内イベントの フィードバックを伝える振動です
振動は Game Controllerフレームワークと Core Hapticsを組み合わせて実装します Core Hapticsのフレームワークは Taptic Engine搭載の iOSデバイスにおいて 触覚イベントの実現に使用されるものと 同じものです ゲームコントローラが触覚対応の場合は その触覚プロパティを使用して 直接 触覚エンジンのインスタンスを作成できます この単一のインスタンスにより 異なるベンダーのゲームコントローラ間の 違いが抽象化されます 触覚の分野についての詳細は ビデオ「Advancements in Game Controllers」と 「Introducing Core Haptics」を ご覧ください オーディオに関しては Apple SDKは充実したアプリ体験を 生み出すために不可欠な オーディオのフレームワークと テクノロジーの包括的なセットを提供します 特に PHASEフレームワークは ゲームに最適です PHASEは 物理オーディオ空間化エンジンの略です ヘッドフォンやスピーカーなど 様々な種類の出力デバイスで 豊かでダイナミックなオーディオ体験を 提供する上で役立ちます PHASEはさらに ゲームのシーンを理解して 幾何学的なサウンドオクルージョンなどの 複雑な効果のシミュレーションもできます 詳細については PHASEを紹介するビデオをご覧ください
ゲームのロジックを ミドルウェアSDKと統合して 音楽やサウンドエフェクトを 再生することもできます この場合 Appleデバイスで Audiokinetic WwiseやFMODなどの 人気のミドルウェアを利用できます ゲームポーティングの サンプルプロジェクトをご確認ください ゲーム内でプレイヤーが撃ったり 物体が衝突したりした時に PHASEを使用して ステレオサウンドを再生しています Appleデバイスでゲームを際立せるためには macOSとiOSの両方を 簡単にターゲットにできることに加えて すべてのプレイヤーのデバイス間で ゲームの状態を同期させる必要があります 例えば プレイヤーが自宅のデバイスで プレイを開始するとします マイルストーンを達成し ゲームをセーブしたら セーブデータは iCloudにアップロードされます その後プレイヤーはバスに乗ります プレイヤーは問題なく iPhoneでゲームを開き iCloudからセーブデータを読み込み プレイに同期させることで 前回中断したところから再開できます 最後にプレイヤーがカフェに行き より大きいiPadの画面で プレイすることにした場合 iCloudからゲームの進行状況を 読み込めます
外出時におけるデバイス間での進行状況の 同期の鍵となるのが クラウドセーブです CloudKitを使うと デバイス間の シームレスな切り替えが可能になり ゲームの進行状況が常に保存されます ゲームポーティングプロジェクトでは ハイスコアなどのゲームのセーブデータを iCloudを介して デバイス間で転送する方法を確認できます
サンプルには 同期を処理する CloudSaveManagerクラスが 含まれています 試してみるには iCloudのIDを使用して設定を行い ゲームのセーブデータを含む 既存のフォルダを指定します サンプルではゲーム起動時にsyncを呼び出し 完了ハンドラブロックを渡します このブロックでは ローカルデータと クラウドデータの間のマージ競合を 効果的に処理できます 最後に 進行状況を クラウドに保存するために セーブファイルの書き込みのたびに uploadが呼び出されます ここでも完了ハンドラを渡して 競合を解決します 様々なデバイスでプレイできるのは 良いことですが 進行状況に基づき ゲーム内の達成目標がアンロックされ それを友達に自慢できなければ 満足感は得られません Game Centerでは このような ソーシャル機能を簡単に追加できます 達成目標を App Store Connectで作成し ゲームに関連づけます 各達成目標には一意のIDがあり ゲームではそれを使用して プレイヤーの目標達成状況を報告します プレイヤーの認証後 GKAchievementクラスの reportAchievements関数を使って 最新の進行状況の パーセンテージを報告します
達成目標を Game Centerで設定しておくと プレイヤーはデバイスを シームレスに切り替えて 継続的に目標の達成に取り組めます
ゲームポーティングのサンプルコードでは App Store Connectで 達成目標を設定し Game Centerに報告する手順を 詳しく確認できます しかし コードを記述するだけでは 優れたゲームをAppleデバイスに ポーティングできません ここからは 再度Jacekが担当し Metalツールについて詳しく説明します ありがとう Metalは 優れた デベロッパツールのスイートを提供して ポーティングされたゲームの デバッグとプロファイリングを支援し Appleデバイスで そのゲームの可能性を 最大限に実現できるようにします まず ランタイム検証により APIの使用とシェーダコードの両方における 一般的な問題を把握できます Metal Performance HUDは オーバーレイを提供し ゲームのリアルタイムパフォーマンスを 高めます XcodeのMetalデバッガの デバッグと プロファイリングの高度なワークフローでは 依存関係の分析や 視覚的なアーティファクトの調査や シェーダのプロファイリングなどが可能です Instrumentsの Metalシステムトレースは ゲームがシステムに与える全体的な影響の 測定と分析に役立ちます 今年追加された機能強化により Metalシェーダコンバータを使用して Metalに導入したHLSLシェーダで これらのデバッグとプロファイリングの ツールを使用できます 変換されたシェーダを利用するための 3つのツールをご紹介します ランタイム検証 シェーダデバッガ シェーダプロファイラです まず これらのツールに シェーダに関する 充分なデバッグ情報を提供できるように プロジェクトの準備を 整えるための方法を説明します Xcodeでデバッグと プロファイリングを行う場合 シェーダの準備に必要な手順はただ1つ DXCコマンドの引数として -Ziと -Qembed_debugを追加することです これにより Metalシェーダコンバータが デバッグ情報をMetalライブラリに 提供できるようになります
デバッグ情報を使用して シェーダが再構築されると デバッグとプロファイリングを 開始する準備が整います Metalが提供する ランタイム検証の 1つ目のレイヤはAPI検証です API検証では Metal APIの不正使用から ユーザーを保護するために リソースイニシャライザや 関数の引数や サポート対象外の機能をチェックします 非常に軽量なので 開発プロセス全体を通じて 有効にしておくことをおすすめします Metalシェーダコンバータのワークフローの 検証が今年改善され 引数バッファにエンコードされた サンプラの状態の検証が可能になりました Metalランタイム検証の2つ目のレイヤは シェーダ検証です シェーダのバグの検出に使用でき 特に 未定義の動作を引き起こす 可能性のあるバグの検出に有効です シェーダ検証は Address Sanitizerを搭載しています 無効なリソースの使用や 常駐の問題の有無をチェックします 潜在的なスタックオーバーフローを 検出します また 不正なタイプのテクスチャへの アクセスも 検出できるようになりました これは 変換されたシェーダにテクスチャを バインドする時によく発生するエラーです このケースについて シェーダ検証の新しい検証チェックで 注目すべき点は CPUのAPI側と GPUのシェーダ側の間の テクスチャタイプの不一致の問題を検出し 元のシェーダコード内に 直接問題を表示している点です 高度なゲームには 何千ものシェーダが 含まれる場合があります そのため Appleは今年 シェーダ検証によって検証する シェーダコードの領域を より細かく制御できるようにしました ご自身のゲームに一番精通している デベロッパのみなさんが 重点的に確認したい点に応じて 選択したパイプラインのシェーダ検証を 有効化/無効化できるようにしました これにより その時点では重要でない問題による ノイズの削減や シェーダ検証を有効にしている時の ゲームパフォーマンスの向上を実現できます パイプラインごとの検証などの APIとシェーダ検証の各レイヤの 使用方法については Metalドキュメントの こちらの記事をご覧ください 問題を特定のパイプラインに絞り込めたら シェーダデバッガの 独自の強力な機能セットを コードのデバッグ時に利用できます シェーダデバッガの特長は コードのすべての行の すべての変数情報が 一度に表示されることです 左側のデバッグナビゲータには シェーダのすべての実行履歴が表示されます ナビゲータで任意の行を選択すると ソースエディタで そのコード行がハイライトされます
ソースエディタの右側には 変数値のプレビューが表示されます プレビューボタンをクリックすると その特定の変数の より詳細なビューが表示され 隣接する すべてのピクセルの値が表示されます また右側のマスクには このコード行を実行した ピクセルが表示されます
これらすべてにより シェーダの実行に関する 非常に高度なインサイトが得られ 極めて複雑な シェーダの問題でもデバッグできます 最後はシェーダプロファイラです シェーダプロファイラでも 変換された シェーダのサポートが追加されています ゲームのボトルネックを見つける 方法の一つとして 最もコストの高いシェーダを特定し 最もコストの高い関数とコード行を 把握するという方法があります シェーダプロファイラでは これを シェーダのコストグラフにより実現します コストグラフには 最もコストの高い シェーダ関数の呼び出しが表示され 対応するシェーダのソースコードが 下に表示されます ソースコードは パフォーマンス統計に関する注釈とともに 左側のサイドバーに表示されるので 各コード行のコストがわかります 円グラフにマウスを合わせると パフォーマンスのポップオーバーが表示され そのコード行の詳細な内訳を確認できます GPUで実行された命令の数や 様々な命令カテゴリのコストなどが わかります この情報を使用すると シェーダの最も高コストな部分がどこか 迅速に絞り込むことができます ただし シェーダのパフォーマンスは 画面上のピクセルごとに 異なる場合があります これは シェーダが 様々なコードパスを実行している場合や ピクセルの位置に応じて異なるリソースを 使用している場合に発生します このような状況では パフォーマンスのヒートマップを使用すると 最もコストの高いピクセルを可視化できます ズームインして そのピクセルをさらに詳しく調べ そのピクセルが属するSIMDグループの 追加情報を確認できます
ピクセルを選択すると SIMDグループの実行履歴が表示され すべてのスレッドの呼び出しスタックが 視覚化されます 特定の時点において どのスレッドが アクティブであったかも確認できます
実行履歴の下には シェーダのソースコードが表示され 各行で実行されている命令の数などの パフォーマンスに関する注釈もつきます
これらのパフォーマンス分析の ワークフローと Metalシェーダツールの その他の改善により ゲーム開発のための 最適なツール体験が実現します Metalシェーダコンバータを 使用する場合も Metalシェーディング言語で シェーダを ネイティブ実装する場合も同様です ポーティングのあらゆるステップで すべてのMetalツールを使用できます 元のWindowsバイナリの評価から ゲームのMetalバージョンの ポーティング デバッグ 最適化まで あらゆるステップで使用できます Metalツールのスイート全体の詳細や 関連するドキュメントについては Apple Developerの Webサイトをご覧ください ゲームをデバッグして さらに最適化するための 優れたテクニックについてご紹介する 過去のビデオもご覧ください
本セッションの説明は多岐にわたりました Mac iPad iPhoneへの ポーティングを簡単にするための ツールとプラットフォームの 多くの機能強化をご紹介しました これらのツールはすべて現在利用可能です また Game Porting Toolkit 2の 新しいランディングページが developer.apple.comにあります これらのツールは各々単体で入手できるほか 統合パッケージもダウンロードできます パッケージには ゲームのポーティングを 始めるために必要な すべてのものが含まれています これまでになくMac iPad iPhoneへの ゲームのポーティングは簡単になりました Game Porting Toolkit 2に含まれている 新規および更新版のツールは プロセスの各ステップで サポートを提供します 評価や ゲームのコードと アセットの引き継ぎのほか Appleデバイスに合わせた ゲーム体験の最適化などを利用できます 新しいゲームポーティングの サンプルコードは ポーティングの道筋を示す優れたガイドです 改良されたMetalツールを使えば ゲームのデバッグやプロファイリングが 大幅に簡単になります Game Porting Toolkit 2を ダウンロードして ぜひお試しください また 今年のビデオ 「Design advanced games for Apple platforms」もご覧ください みなさんの制作した次世代ゲームが すべてのAppleデバイスで プレイ可能になるのが楽しみです ご視聴ありがとうございました
-
-
12:51 - Build a residency set
// 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();
-
14:46 - Upscale image with MetalFX
// 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);
-
19:53 - Use the cloud save manager
// 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. }];
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。