【xR】各種HMDの描画ポリゴン数のパフォーマンス測定(AppleVisionPro/Quest3/ThinkRealityVRX)

## 更新点
- ThinkRealityVRXで良い記録が取れたため、SnapdragonSpaces(v0.19.1.1)版の結果を追記しました。
# TL;DR
- PassThroughをonにした状態で1M△のモデルを描写した時のパフォーマンスを測定したよ
- MetaQuest3は850k△以下,ThinkRealityVRXとAppleVisionProは1M△以上でも安定してコンテンツを表示できるよ

# 概要
近年、PassThrough機能を備えたHMDが登場しています。これらのHMDを使用してコンテンツを作成する際、どの程度のポリゴン数ならfps低下が許容できるかを調査しました。調査は測定用スクリプトを作成し、各種HMD用のUnity向けに展開されているSDKを利用して行いました。今回は以下の3つのHMDで調べてみました。
  
  - [MetaQuest3](https://www.meta.com/jp/quest/quest-3/)
  - [ThinkRealityVRX](https://www.lenovo.com/jp/ja/thinkrealityvrx) 
  - [AppleVisionPro](https://www.apple.com/apple-vision-pro/)

# 検証環境
今回は動作の確認できている環境に追加して検証を行いました。

| HMD    | VisionPro                                                                                                    | Quest3                                                                                                      | VRX(FW: 829)             | VRX(FW: 933)                                               | 
| :----- | :----------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------- | :------------------------ | ----------------------------------------------------------- | 
| Unity  | 2022.3.18f1                                                                                                  | 2021.3.34f1                                                                                                 | 2021.3.16f1               | 2021.3.16f1                                                 | 
| Render | URP（14.0.10）                                                                                               | Built-in                                                                                                    | URP（12.1.8）             | URP（12.1.8）                                               | 
| SDK    | [PolySpatial](https://docs.unity3d.com/Packages/com.unity.polyspatial.visionos@1.0/manual/index.html)(1.0.3) | [Meta XR Core SDK](https://assetstore.unity.com/packages/tools/integration/meta-xr-core-sdk-269169)(60.0.0) | Snapdragon Spaces(0.17.0) | [Snapdragon Spaces](https://spaces.qualcomm.com/)(0.19.1.1) | 
|        | PolySpatial visionOS(1.0.3)                                                                                  | Meta XR Interaction SDK(60.0.0)                                                                             |                           |                                                             | 
|        | PolySpatial XR(1.0.3)                                                                                        | Meta XR Interaction SDK OVR Integration(60.0.0)                                                             |                           |                                                             | 
|        | PolySpatial visionOS XR Plugin(1.0.3)                                                                        |                                                                                                             |                           |                                                             | 

:::note info
VRXのFirmwareバージョンは、S000000~ とある部分のS以降の数値、上3桁だそうです。
:::
# 手法
3種類のHMDに対して10k△のUV球を徐々に表示し、合計で100個程度表示しました(合計で1M△)。HMDで実測する際にPassThroughを有効し現実空間を写しながら測定を行いました。

## 表示したUV球の仕様
Unityの最適化を避けるために以下の工夫をおこなっています。レンダーのバッチング条件を満たさないようにし、Draw CallとSetPass Callの量を最大化するためです。([解説](https://ny-program.hatenablog.com/entry/2022/06/12/143759))

- materialのGPUInstance はOFFに設定
- スケールは0.8~1の間でランダムに変形(Draw Call)
- UV球が生成されるたび、新たにmaterialを割当(SetPass Call)
- 
    ```
    var r = g.GetComponent<Renderer>();
    r.material = Instantiate(r.material);
    ```
#### UnityEditor上で表示したUV球
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116805/fb78b058-8bd7-bcc8-8aae-2ccb0138a522.png)

# 結果
## AppleVisionPro
1M△をPassThroughありで表示しても100fpsから低下することはありませんでした。流石VisionPro！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116805/ed16676f-26b1-7e75-c2f7-4f801c5b5bd1.png)
## MetaQuest3
Quest3のアプリケーションは基本的に72fpsで45分間連続動作する[こと](https://developer.oculus.com/resources/vrc-quest-performance-1/)が求められます。それを満たせなくなるのは約850k△程度からでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116805/5c8c2a46-d7c1-df1a-f84d-5f4c46eda67e.png)

## ThinkRealityVRX(SDK v0.19.1.1) (2024/03/06更新)
測定開始時から50fps前後で安定して動作しています。v0.17.0と比べると2倍近い性能改善がなされています。VR酔いを避けるために60fpsを維持したいところですが僅かに足りていません。しかしVRXは **カメラ画像へのアクセス、ImageTracking等**、AR/MR開発で欲しい機能が最初から提供されています。できることの幅の広さでVRXはQuest3に勝っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116805/56e78db2-f9f6-6fa3-2fe6-30f9934e0f19.png)

## ThinkRealityVRX(SDK v0.17.0)
古いバージョンでは測定開始時から急激なFPSの低下が見られます。VR酔いを避けるために60fpsを維持したいところですが50k△程度からフレームレートが低下し、20fps程度で安定する結果となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116805/8463a49e-a764-1359-3a36-ed29825df128.png)

## 所感
VisionProが発売されどの程度の表現ができるのか興味があり、手元にあるHMDと比較しながら調査を行いました。まさか1M△を100fpsで描写できるとは思わずVisionProの底力を感じます。Quest3の限界が850k△のため、それ以上のコンテンツを扱いたい場合VisionProは最適だと言えるでしょう。ログファイルが取得できない等問題はありましたが、いずれ改善されていくと思われます。ThinkRealityVRXは、fpsだけを比べれば他のHMDには劣りますが、他にはできない機能をもっているため十分に活躍できる可能性があります。

どのHMDもまだまだ進化の途中です。最適化やSDKの充実など開発環境の更新が楽しみですね！

### 弊社Graffityでは、AR/MR系のエンタメコンテンツを作っています。

Graffity ではVisionPro 専用ゲーム [NinjaGazeTyping](https://apps.apple.com/us/app/ninja-gaze-typing/id6476380797) をはじめとしたAR/MRのエンタメコンテンツ開発を主に行なっています！

今後も積極的にVisionPro向けのエンタメコンテンツを作っていきますので、作ってみたいという方を大募集しております。ぜひご参加ください！！

https://graffity.jp/