プロダクト ニュース

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

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

Android XR を搭載した Samsung Galaxy XR がリリースされました。このブログ投稿は、Android XR 向けアプリの学習、開発、準備に役立つリソース(ブログ投稿、動画、サンプルコードなど)を提供する Android XR Spotlight Week の一環として公開されています。  

今週、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 レジデント ドロワーが適切にバッチ処理されているかどうかを確認しますか?[ハイブリッド バッチ グループ] エントリを探します。これらの視覚的な確認により、最適化設定が実際に有効になっているかどうかを把握できます。

シーンの最初の 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 の最適化を追加して、パフォーマンスのヘッドルームを増やします。

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

次のステップ: スキルを拡大する

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

執筆者:

続きを読む