Samsung Galaxy XR が登場。Android XR を搭載しています。このブログ投稿は、 Android XR Spotlight Week の一環として公開されたものです。このイベントでは、Android XR 向けアプリの学習、開発、準備に役立つブログ投稿、動画、サンプルコードなどのリソースを提供しています。
今週、Samsung が Galaxy XR をリリースしました。これは、Google および Qualcomm とのコラボレーションにより構築されたものです。デベロッパーにとってエキサイティングなこの時期に、XR アプリのパフォーマンスを最大限に引き出すためのヒントをご紹介します。
XR 以外のデバイスでゲームやアプリのパフォーマンスが低いと、ユーザーは不満を感じる可能性があります。XR の世界では、パフォーマンスはオプションではなく、アプリの成功に不可欠な要素です。XR でフレームレートの目標を達成できないと、乗り物酔いなどのより深刻な問題が発生する可能性があります。
このガイドでは、Android XR 開発で理解しておく必要がある、パフォーマンスの最適化に関する重要なポイントについて説明します。どの機能がパフォーマンスを最も向上させるか、いつ使用するか、そしてそれらがどのように連携してフレームレートの目標を達成するかを学びます。
Google が目指しているのは、
- 最小: 72 fps(Google Play の品質に関するガイドラインの一部)
- オプション: 90 fps(フレームあたり 11 ミリ秒の予算)
このような高いフレームレートを維持することが重要である理由について詳しくは、パフォーマンス ガイドラインをご覧ください。
XR 固有のパフォーマンス機能
まず、XR 固有の 2 つのパフォーマンス機能である、フォービエイテッド レンダリングと Vulkan サブサンプリングについて説明します。
フォービエイテッド レンダリング
フォービエイテッド レンダリングは、2 つのモードがある最適化です。1 つ目は静的モードです。このモードでは、画面の中心が高解像度でレンダリングされ、中心から離れるほど解像度が低くなります。
2 つ目はアイトラッキング モードです。このモードでは、ユーザーが見ている領域を詳細にレンダリングし、周辺の表示品質を下げます。これは、人間の視覚の仕組みを模倣したもので、人間が焦点を合わせている特定の領域のみを詳細に表示します。
フォービエイテッド レンダリングは、ユーザーが認識する画質を損なうことなく、GPU のワークロードを大幅に削減します。フォービエイテッド レンダリングの優れた点は、ユーザーは周辺視野の品質低下に気づかない一方で、GPU のパフォーマンスは確実に向上することです。
複雑な 3D アーティファクトを展示する博物館の体験を構築しているとします。フォービエイテッド レンダリングを使用しない場合、画角内のすべてをレンダリングしようとすると、90 fps を維持するのは困難です。フォービエイテッド レンダリングを使用すると、ユーザーが見ている部分ではハイポリゴンの詳細を維持し、背景環境は低品質でレンダリングできます。ユーザーは違いに気づきませんが、シーンに詳細を追加する余裕が生まれます。
Vulkan サブサンプリング
Vulkan サブサンプリングは、フォービエイテッド レンダリングの強力な味方です。フォービエイテッド レンダリングでは、さまざまな品質レベルでレンダリングする対象を決定しますが、Vulkan サブサンプリングでは、フラグメント密度マップを使用して、さまざまな品質レベルを効率的にレンダリングする方法を処理します。
フォービエイテッド レンダリングと組み合わせると、Vulkan サブサンプリングによりパフォーマンスが 0.5 ミリ秒向上します。また、周辺視野のギザギザしたエッジを滑らかにし、画像全体をより鮮明に見せることもできます。
たとえば、ユーザーが計器やコントロールに集中するフライト シミュレーター ゲームでは、フォービエイテッド レンダリングと Vulkan サブサンプリングを組み合わせることで、詳細なコントロールは鮮明にレンダリングされ、周辺のコックピット構造はより少ないリソースを使用します。0.5 ミリ秒の差はそれほど大きくないように思えますが、インタラクティブ要素を追加する余裕があるか、激しいシーンでフレーム落ちが発生するかの違いになります。
複雑なシーン向けの GPU 機能
フォービエイテッド レンダリングと Vulkan サブサンプリングのほかにも、スマートなインスタンス化とカリングによって不要な負荷を軽減する GPU 機能があります。これは、繰り返しのジオメトリや大きなオクルージョンがある複雑なシーンで特に効果的です。
GPU 常駐ドロワー
GPU Resident Drawer は、GPU インスタンシングを自動的に使用して描画呼び出しを減らし、CPU 処理時間を解放します。つまり、CPU が各オブジェクトについて個別に GPU に指示するのではなく、GPU が類似したオブジェクトをまとめてバッチ処理します。
この機能は、森の木々、オフィスビルの家具、環境全体に散らばる小道具など、メッシュが繰り返される大規模なシーンで最も効果的です。
同じベースメッシュを使用した 200 本の木がある森のシーンを想像してください。GPU Resident Drawer がないと、200 回の描画呼び出しが GPU を消費するため、CPU が解放されます。この機能を有効にすると、GPU がこれらの木をインテリジェントにインスタンス化し、描画呼び出しを 5 ~ 10 回に減らすことができます。GPU の使用量を大幅に削減できるため、ゲームプレイ ロジックや物理演算に投資できます。
GPU オクルージョン カリング
GPU オクルージョン カリングは、CPU ではなく GPU を使用して、隠れたオブジェクトを識別し、レンダリングをスキップします。他のオブジェクトの背後に隠れているものを自動的に検出するため、ユーザーに見えないものに GPU を浪費することはありません。
この機能は、複数の部屋がある屋内空間、密集した環境、壁、床、物体が自然に視界を遮る建築シーンで特に効果的です。
たとえば、マルチルーム(機能)の家のエクスペリエンスを構築するとします。ユーザーがリビングルームにいるときに、壁の向こうに完全に隠れているキッチンの詳細をレンダリングするために GPU サイクルを浪費する必要はありません。GPU オクルージョン カリングは、隠れたオブジェクトのレンダリングを自動的にスキップするため、実際に表示されるオブジェクトのパフォーマンス バジェットを増やすことができます。
パフォーマンスのモニタリング
これらの機能を使用するだけでは不十分です。また、最適化の効果を測定して、その影響を定量化し、変更が実際に機能していることを確認する必要もあります。
Performance Metrics API
Performance Metrics API を使用すると、アプリのメモリ使用量、CPU パフォーマンス、GPU パフォーマンスをリアルタイムでモニタリングできます。コンポジタ レイヤとランタイム レイヤから包括的なデータが提供されるため、アプリケーションで何が起きているかを正確に把握できます。
変更を加える前にベースラインを確立し、最適化を適用して、影響を測定し、繰り返します。このデータドリブンなアプローチにより、推測ではなく、実際にパフォーマンスが向上していることを把握できます。
フォービエイテッド レンダリングを有効にする前は、GPU フレーム時間が 13 ミリ秒で、11 ミリ秒の予算を超えていたとします。フォービエイテッド レンダリングを有効にして再度測定すると、9 ミリ秒に短縮されるはずです。4 ミリ秒の余裕ができたことで、シーンに詳細を追加したり、他の部分の画質を向上させたり、より幅広いコンテンツでパフォーマンスをスムーズにしたりできます。
これらの指標がないと、最適化を盲目的に行うことになります。Performance Metrics API は、特定のユースケースに実際に役立つ情報を正確に提供します。
フレーム デバッガ
フレーム デバッガは、シーンがどのようにレンダリングされているかをフレームごとに正確に把握するための Unity の組み込みツールです。描画呼び出しのシーケンスが表示され、それらをステップ実行して、最適化が正しく機能していることを確認できます。
SRP Batcher が動作していることを確認するには、Frame Debugger で「RenderLoopNewBatcher」エントリを探します。GPU Resident Drawer が適切にバッチ処理を行っているかどうかを確認するには、「Hybrid Batch Group」エントリを探します。これらの視覚的な確認により、最適化設定が実際に有効になっているかどうかを把握できます。
シーンの最初の 50 回の描画呼び出しをステップ実行します。類似したオブジェクトがバッチ処理されずに個別に描画されている場合は、インスタンス化またはバッチ処理が正しく機能していないことを示しています。フレーム デバッガを使用すると、これらの問題がすぐに表示されるため、対処できます。
その他の最適化
上記の最適化に加えて、パフォーマンス ガイドの全文では、その他の最適化についてもいくつか説明しています。以下にその概要をまとめます。
- URP 設定: モバイル XR の HDR とポスト プロセッシングを無効にします。これらの機能は、モバイル ハードウェアのパフォーマンス コストに対して視覚的な影響はわずかです。そのため、視覚的な違いはほとんど感じられず、パフォーマンスが大幅に向上します。
- SRP Batcher: 同じシェーダー バリアントを使用する多数のマテリアルを含むシーンの CPU オーバーヘッドを削減します。描画呼び出し間のレンダリング状態の変更を最小限に抑えることで、レンダリングに費やされる CPU 時間を大幅に削減できます。
- ディスプレイのリフレッシュ レート: シーンの複雑さに応じて 72 fps と 90 fps の間で動的に調整されます。複雑なシーケンスではフレームレートを下げて安定性を維持し、シンプルなシーケンスではフレームレートを上げて非常にスムーズなインタラクションを実現します。
- 深度/不透明テクスチャ: シェーダー エフェクトに特に必要でない限り、これらを無効にします。これらは不要な GPU コピー オペレーションを引き起こし、ほとんどのアプリケーションでメリットを提供することなくパフォーマンスを浪費します。
- URP Render Scale: この設定を使用すると、パフォーマンスを向上させるために解像度を下げてレンダリングしたり、画質を向上させるためにレンダリングをアップスケールしたりできます。
これらの最適化やその他の最適化の手順については、Android XR 向けの Unity パフォーマンス ガイドをご覧ください。
まとめ
XR アプリのパフォーマンスは、単に技術的なチェックボックスではありません。快適で魅力的なエクスペリエンスと、ユーザーに不快感や不快感を与えるエクスペリエンスの違いです。今回ご紹介した最適化は、最新の XR デバイスで重要なフレームレート目標を達成するためのツールキットです。
ロードマップは次のとおりです。
- まずは、フォービエイテッド レンダリングと Vulkan サブサンプリングから始めましょう。これらの XR 固有の機能により、GPU の使用量を即座に、かつ顕著に削減できます。
- 繰り返しジオメトリや内部空間を含む複雑なシーンがある場合は、GPU Resident Drawer とオクルージョン カリングを追加します。
- Performance Metrics API ですべてをモニタリングして、変更が実際に役立っていることを確認する
- URP の追加の最適化を検討して、パフォーマンスの余地を広げる
継続的に測定して改善を繰り返すことが重要です。すべての最適化がすべてのプロジェクトに等しくメリットをもたらすわけではないため、Performance Metrics API を使用して、特定のユースケースに実際に役立つパフォーマンス指標を明確に把握してください。
次のステップ: スキルを広げる
Google Vids と Google Workspace の以下のリソースをご確認ください。
-
サービスに関する最新情報このたび、Android XR で Unreal Engine と Godot の公式サポートが開始されました。また、生産性を高め、新しい XR 機能を有効にするために設計された新しいツール、Android XR エンジンハブと Android XR インタラクション フレームワークもリリースします。
Luke Hopkins, Ryan Bartley • 所要時間: 4 分 -
サービスに関する最新情報次期 Android リリースをターゲットとするアプリは、WRITE_CONTACTS 権限を使用して連絡先に直接書き込むことができなくなります。
Roxanna Aliabadi Walker • 所要時間: 6 分 -
サービスに関する最新情報エージェント開発が加速する中、Android エンジニアリングは、アシスト型のコード補完から、開発者の指示の下でエンドツーエンドで実行するエージェントへと移行し、エキサイティングな新しいフロンティアに到達しています。使用するモデルとエージェントを完全に選択でき、柔軟性があります。
Jason Buchel • 所要時間: 3 分
Android 開発に関する最新の分析情報を毎週メールでお届けします。