プロダクト ニュース

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

所要時間: 6 分
Luke Hopkins さんのプロフィールを表示
Luke Hopkins Developer Relations Engineer, Android

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

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

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

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

目指しているのは次のとおりです。

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

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

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

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

視線追跡レンダリング

視線追跡レンダリングは、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 Resident Drawer がない場合、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 ミリ秒に低下しているはずです。つまり、4ms の余裕が生まれ、シーンにさらに詳細な描写を加えたり、他の部分の視覚的な品質を向上させたり、あるいはより幅広いコンテンツでよりスムーズなパフォーマンスを確保したりすることが可能になります。

これらの指標がないと、最適化は当て推量になります。パフォーマンスメトリクス API は、あなたの特定のユースケースにおいて実際に何が役立っているのかを正確に教えてくれます。

フレーム デバッガ

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

SRP Batcher が正常に動作していることを確認したいですか?フレーム デバッガで「RenderLoopNewBatcher」エントリを探します。GPU Resident Drawer が正しくバッチ処理されているか確認していますか?「ハイブリッドバッチグループ」のエントリを探してください。これらの視覚的な確認により、最適化設定が実際に有効になっているかどうかを把握できます。

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

追加の最適化

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

  • URP 設定: モバイル XR の HDR とポスト プロセッシングを無効にします。これらの機能は、モバイル ハードウェアでのパフォーマンス コストに対して視覚的な影響が最小限に抑えられているため、視覚的な違いをほとんど感じることなく、パフォーマンスの向上を実感できます。
  • SRP Batcher: 同じシェーダー バリアントを使用するマテリアルが多数あるシーンの CPU オーバーヘッドを削減します。描画呼び出し間のレンダリング状態の変化を最小限に抑えることで、レンダリングに費やされる CPU 時間を大幅に削減できます。
  • ディスプレイのリフレッシュレート: シーンの複雑さに基づいて、72fps と 90fps の間で動的に調整します。複雑なシーケンス中はフレームレートを下げて安定性を維持し、より単純な場面ではフレームレートを上げて非常に滑らかな操作性を実現します。
  • Depth/Opaque Textures: シェーダー効果に特に必要な場合を除き、無効にします。これらは不要な GPU コピー操作を引き起こし、ほとんどのアプリケーションにとって何のメリットももたらさずにパフォーマンスを浪費する。
  • URP レンダー スケール: この設定では、パフォーマンスを向上させるために低解像度でレンダリングしたり、画質を向上させるためにレンダリングをアップスケールしたりできます。

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

まとめ

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

こちらがあなたのロードマップです。

  1. まず、フォービエイテッド レンダリングと Vulkan サブサンプリングから始めます。これらの XR 固有の機能により、GPU の使用量をすぐに大幅に削減できます。
  2. 繰り返し形状や内部空間を含む複雑なシーンの場合は、GPU 常駐ドロワーとオクルージョンカリングを追加してください。
  3. Performance Metrics API を使用してすべてをモニタリングし、変更が実際に役立っていることを確認する
  4. パフォーマンスの余力を増やすための URP の追加最適化

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

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

Google Vids と Google Workspace の以下のリソースをご確認ください。

  • Android XR 向け Unity パフォーマンスガイド- 対象となるすべての機能について、詳細な手順を追った実装手順書ここ
  • Unity と Android XR 入門 - 開発環境をセットアップして 構築を開始します
  • Android XR デベロッパー ドキュメント - Android XR のすべての機能に関する包括的なガイド
作成者:
続きを読む