はじめに

Unity 6で新しく登場した「GPU Resident Drawer」は、描画データをGPUに常駐させることで、CPUからの描画指示を最小限に抑え、大幅なCPU負荷削減を実現する描画技術です。
数千~数万インスタンスの描画で効果を発揮するとされ、大量のオブジェクトを扱うシーンで特に注目されています。
もしこの技術がスタンドアロンVRでも有効なら、シーン最適化の大きな武器になる可能性があります。
そこで今回は、Meta Quest 3の実機で「GPU Resident Drawer」を使い、
* どのくらいパフォーマンスが改善するのか
* 本当にVRシーンでも効果があるのか
を実際に試してみた結果を詳しく紹介します。

GPU Resident Drawerとは

GPU Resident Drawerの最大の特徴は、描画データをGPU側に常駐させる点です。
一般的な描画では、毎フレームごとにCPUからGPUへ描画データを送信しなければならず、インスタンス数が増えるとCPU負荷が急増します。
しかしGPU Resident Drawerでは、一度GPUにアップロードしたメッシュデータ・インスタンスデータ(位置、回転、スケールなど)をGPU側で保持し続けるため、CPUは最低限の描画命令のみ送信すればよくなるのです。
これにより、CPU負荷を大幅に削減しつつ、大量のインスタンス描画を高速化できます。

現時点(Unity 6.x)では、MeshRenderer専用の機能であり、Skinned Mesh RendererやParticle Systemなどには非対応です。
そのため、静的メッシュや単純なインスタンス描画向けの技術として使われています。

設定方法

  • Graphics APIをVulkanに設定

GPU Resident Drawerは公式ドキュメントを読むとOpenGL ESを除く、コンピュートシェーダーに対応しているプラットフォームとグラフィックAPIである必要があります。
そのため、今回はMeta Quest 3で実装するためにGraphics APIを必ずVulkanに変更する必要があります。
XrealのようにVulkan非対応のデバイスでは、この機能は使用できません。

  • Universal Render Pipeline Assetの「GPU Resident Drawer」を「Instanced Drawing」に変更

URPの設定でGPU Resident Drawerの動作モードを「Instanced Drawing」に変更します。
これにより、GPU Resident Drawerが有効になります。

  • Project Settingsの「Batch Renderer Group Variants」を「Keep All」に変更

GPU Resident Drawerは内部的にBatchRendererGroup APIを使用しており、すべてのシェーダーバリアントをコンパイルするため、
「Batch Renderer Group Variants」をKeep Allに設定する必要があります。
ただし、ビルド時間は長くなる点に注意が必要です。

  • Rendering Pathを「Forward+」に変更

GPU Resident DrawerはForward+ Rendering Path専用です。
必ずForward+に変更してください(他のRendering Pathでは動作しません)。

  • Static Batchingを無効化する

以上で設定は完了です。

次にEditor上でどのような効果があるかを確認していきます。

Editorで確認

今回は、ローポリゴンのモデル4種類(頂点数:746、765、491、263)を10×10×10の合計1000個配置して検証しました。

テクスチャ解像度はすべて2048×2048、使用するシェーダーはURPの「Lit」をそのまま使用しています。

Editor上のStatisticsで確認を行うと、Batchesが4693から117とかなり削減されている事が分かります。

また、Frame Debuggerで確認するとGPU Resident Drawerがdisableの時は4回に分けて描画を行っているのに対し、

GPU Resident Drawerを使用している時は1回の描画処理で済んでいます。

実機で確認

Meta Quest 3での実機検証では、Foveated Renderingを有効化、Render Scaleを0.8、FSR(FidelityFX Super Resolution)を使用した状態で行いました。

設定 FPS(目安)
GPU Resident Drawer 無効 50〜60 FPS(不安定)
GPU Resident Drawer 有効 65〜75 FPS(安定、60FPS超)

有効化することで、FPSが60以上で安定し、描画負荷の大幅な軽減が確認できました。

おわりに

GPU Resident DrawerはMeshRenderer限定の機能ですが、同じオブジェクトを多数配置するシーンでは非常に有効な手段となります。
特に、森や都市、建物の内部など、繰り返しの多いシーンでは大幅なパフォーマンス改善が期待できます。

Meta Quest 3のようなスタンドアロンVRデバイスで、効率的にパフォーマンスを向上させたい場合は、積極的に検討する価値のある技術なので、ぜひ試してみてください。



ギャップロを運営しているアップフロンティア株式会社では、一緒に働いてくれる仲間を随時、募集しています。 興味がある!一緒に働いてみたい!という方は下記よりご応募お待ちしております。
採用情報をみる