プロダクト ニュース

Unity を使用して Android XR のパフォーマンスを最適化する

所要時間 6 分
Luke Hopkins
デベロッパー リレーション エンジニア、Android

Android XR を搭載した Samsung Galaxy XR がリリースされました。Este post de blog faz parte da nossa Semana de Destaque do Android XR, onde fornecemos recursos — posts de blog, vídeos, código de exemplo e muito mais — todos projetados para ajudar você a aprender, criar e preparar seus apps para o Android XR.  

今週、Samsung は Google と Qualcomm との共同開発による Galaxy XR をリリースしました。デベロッパーにとってエキサイティングな時期であり、XR アプリのパフォーマンスを最大限に引き出すお手伝いをしたいと考えています。

XR 以外のデバイスでゲームやアプリのパフォーマンスが低いと、ユーザーは不満を感じますが、XR の世界ではパフォーマンスは単なるオプションではなく、アプリの成功に不可欠な要素です。XR でフレームレートの目標を達成できないと、VR 酔いなど、はるかに深刻な問題を引き起こす可能性があります。

このガイドでは、Android XR 開発で理解しておくべき重要なパフォーマンス最適化について説明します。どの機能がパフォーマンスの向上に最も貢献するか、いつ使用するか、どのように連携してフレームレートの目標を達成するかについて説明します。

目標は次のとおりです。

  • 最小: 72 fps(プレイ品質に関するガイドラインの一部)
  • オプション: 1 フレームあたり 11 ミリ秒の予算で 90 fps

高いフレームレートを維持することが重要な理由について詳しくは、パフォーマンス ガイドラインをご覧ください。   

XR 固有のパフォーマンス機能

まず、視線追跡レンダリングと Vulkan サブサンプリングという 2 つの XR 固有のパフォーマンス機能について説明します。

視線追跡レンダリング

視線追跡レンダリングは、2 つのモードを持つ最適化です。1 つ目は静的モード で、画面の中央を高解像度でレンダリングし、視線が外れるほど解像度を徐々に下げます。

2 つ目は視線追跡モード で、視線が向いている領域を詳細にレンダリングし、周辺に表示される画質を低下させます。これは、人間の視覚の仕組みを模倣したもので、特定の領域に焦点を当てた場合にのみ細かい部分が見えるようになっています。

視線追跡レンダリングは、ユーザーが認識する画質を損なうことなく、GPU のワークロードを大幅に削減します。視線追跡レンダリングの優れた点は、ユーザーが周辺視野の画質の低下に気づかない一方で、GPU はパフォーマンスの向上を確実に認識できることです。

複雑な 3D アーティファクトを使用した博物館のエクスペリエンスを構築しているとします。視線追跡レンダリングを使用しない場合、「画角」内のすべてをレンダリングしようとすると、90 fps を維持するのが困難になります。視線追跡レンダリングを使用すると、ユーザーが見ている場所の高ポリゴンの詳細を維持できますが、背景環境は低画質でレンダリングされます。ユーザーは違いに気づきませんが、シーンに詳細を追加する余裕が生まれます。

Vulkan サブサンプリング

Vulkan サブサンプリングは、視線追跡レンダリングの最適な組み合わせです。視線追跡レンダリングは、さまざまな画質レベルでレンダリングするものを決定しますが、Vulkan サブサンプリングは、フラグメント密度マップを使用して、さまざまな画質レベルを効率的にレンダリングする方法を処理します

視線追跡レンダリングと組み合わせると、Vulkan サブサンプリングによりパフォーマンスが 0.5 ミリ秒向上します。また、周辺視野のギザギザのエッジを滑らかにし、画像全体の見た目をきれいにします。

たとえば、ユーザーが計器や操作に焦点を当てるフライト シミュレータ ゲームでは、視線追跡レンダリングと Vulkan サブサンプリングを組み合わせることで、詳細な操作を鮮明にレンダリングできますが、周辺のコックピット構造では使用するリソースが少なくなります。0.5 ミリ秒の追加はわずかに思えるかもしれませんが、追加のインタラクティブ要素を追加する余裕があるか、激しい瞬間にフレームが落ちるかの違いになります。

複雑なシーン向けの GPU 機能

視線追跡レンダリングと Vulkan サブサンプリングに加えて、スマート インスタンシングとカリングによって不要な負荷を軽減する GPU 機能もあります。これらは、ジオメトリが繰り返される複雑なシーンや、大幅なオクルージョンが発生するシーンで特に効果的です。

GPU 常駐ドロワー

GPU 常駐ドロワーは、GPU インスタンシングを自動的に使用して、描画呼び出しを減らし、CPU の処理時間を解放します。そのため、CPU が各オブジェクトを個別に GPU に伝えるのではなく、GPU が類似のオブジェクトをバッチ処理します。

この機能は、森林の木々、オフィスビルの家具、環境全体に散らばった小道具など、同じメッシュが繰り返される大規模なシーンで最も効果的です。

同じベースメッシュを使用する 200 本の木がある森林のシーンを想像してください。GPU 常駐ドロワーがない場合、200 個のドローコールが GPU を消費し、CPU が解放されます。この機能を有効にすると、GPU はこれらの木をインテリジェントにインスタンス化し、ドローコールを 5 ~ 10 個に減らします。これは GPU の大幅な節約であり、ゲームプレイ ロジックや物理演算に投資できます。

GPU オクルージョン カリング

GPU オクルージョン カリングは、 CPU ではなく GPU を使用して、非表示のオブジェクトを特定してレンダリングをスキップします。他のオブジェクトの背後に隠れている(オクルージョンされている)ものを自動的に検出するため、ユーザーが見えないものに GPU を無駄に消費することはありません。

この機能は、複数の部屋がある屋内空間、密集した環境、壁、床、オブジェクトが自然に視界を遮る建築シーンで特に強力です。

たとえば、複数の部屋がある家のエクスペリエンスを構築しているとします。ユーザーがリビングにいるときに、壁の奥に完全に隠れている詳細なキッチンをレンダリングして GPU サイクルを無駄にするのはなぜですか?GPU オクルージョン カリングは、非表示のオブジェクトのレンダリングを自動的にスキップし、実際に表示されるものにパフォーマンス バジェットを割り当てます。

パフォーマンスのモニタリング

これらの機能を使用するだけでは十分ではありません。最適化の効果を測定し、変更が実際に機能していることを確認する必要があります。

Metrics API

Performance Metrics API は、アプリのメモリ使用量、CPU パフォーマンス、GPU パフォーマンスをリアルタイムでモニタリングします。コンポジタ レイヤとランタイム レイヤから包括的なデータが提供されるため、アプリケーションで何が起こっているかを正確に把握できます。

変更を加える前にベースラインを確立し、最適化を適用して効果を測定し、反復します。このデータドリブン アプローチにより、推測ではなく、実際にパフォーマンスが向上していることを確認できます。

視線追跡レンダリングを有効にする前は、GPU フレーム時間が 13 ミリ秒になる可能性があります。これは 11 ミリ秒の予算を超えています。視線追跡レンダリングを有効にして再度測定すると、9 ミリ秒に短縮されます。これにより、シーンに詳細を追加したり、他の場所で画質を向上させたり、より幅広いコンテンツでスムーズなパフォーマンスを確保したりするための 4 ミリ秒の余裕が生まれます。

これらの指標がないと、最適化は当て推量になります。Metrics API は、特定のユースケースに実際に役立つものについて正確な情報を提供します。

フレーム デバッガ

フレーム デバッガは、シーンがフレームごとにどのようにレンダリングされているかを正確に把握するための Unity の組み込みツールです。ドローコールのシーケンスが表示され、ステップ実行して最適化が正しく機能していることを確認できます。

SRP バッチャーが機能していることを確認します。フレーム デバッガで「RenderLoopNewBatcher」エントリを探します。GPU 常駐ドロワーが適切にバッチ処理されているかどうかを確認します。「Hybrid Batch Group」エントリを探します。これらの視覚的な確認により、最適化設定が実際に有効になっているかどうかを把握できます。

シーンの最初の 50 個のドローコールをステップ実行します。類似のオブジェクトがバッチ処理されずに個別に描画されている場合は、インスタンス化またはバッチ処理が正しく機能していません。フレーム デバッガを使用すると、これらの問題をすぐに確認して対処できます。

その他の最適化

上記の最適化に加えて、完全なパフォーマンス ガイドでは、その他の最適化についても説明しています。概要は次のとおりです。

  • URP 設定: モバイル XR の HDR とポスト プロセッシングを無効にします。これらの機能は、モバイル ハードウェアでのパフォーマンス コストと比較して視覚的な影響が最小限であるため、視覚的な違いはほとんど認識できないにもかかわらず、パフォーマンスを大幅に向上させることができます。
  • SRP バッチャー: 同じシェーダー バリアントを使用するマテリアルが多いシーンでの CPU オーバーヘッドを削減します。ドローコール間のレンダリング状態の変更を最小限に抑えることで、レンダリングに費やす CPU 時間を大幅に削減できます。
  • ディスプレイのリフレッシュ レート: シーンの複雑さに応じて 72 fps と 90 fps の間で動的に調整します。複雑なシーケンスではフレームレートを下げて安定性を維持し、単純な場面ではフレームレートを上げて非常にスムーズな操作を実現します。
  • 深度/不透明テクスチャ: シェーダー効果に特に必要な場合を除き、これらを無効にします。ほとんどのアプリケーションでメリットがないにもかかわらず、不要な GPU コピー オペレーションが発生し、パフォーマンスが低下します。
  • URP レンダリング スケール: この設定を使用すると、パフォーマンス上のメリットを得るために解像度を下げてレンダリングしたり、画質を向上させるためにレンダリングをアップスケーリングしたりできます。

これらの最適化とその他の最適化の手順については、Android XR 向け Unity パフォーマンス ガイドをご覧ください。

まとめ

XR アプリのパフォーマンスは、単なる技術的なチェックボックスではありません。快適で魅力的なエクスペリエンスと、ユーザーが気分が悪くなったり不快に感じたりするエクスペリエンスの違いです。説明した最適化は、最新の XR デバイスで重要なフレームレートの目標を達成するためのツールキットです。

ロードマップは次のとおりです。

  1. 視線追跡レンダリングと Vulkan サブサンプリングから始めます。これらの XR 固有の機能により、GPU の使用量をすぐに大幅に削減できます。
  2. ジオメトリが繰り返される複雑なシーンや屋内空間がある場合は、GPU 常駐ドロワーとオクルージョン カリングを追加します。
  3. パフォーマンス指標 API でモニタリングして、変更が実際に役立っていることを確認します。
  4. URP の追加の最適化を調べて、パフォーマンスの余裕を増やします。

継続的に測定して反復することが重要です。すべての最適化がすべてのプロジェクトに同じようにメリットをもたらすわけではないため、Metrics API を使用して、特定のユースケースに実際に役立つものを明確に把握してください。

次のステップ: スキルを広げる

さらに詳しく知りたいですか?以下のリソースをご確認ください。

執筆者:

続きを読む