前回に引き続き、VR用公式チュートリアルネタです。
今回はUnityにおけるVRアプリの最適化について
UnityのVR用公式チュートリアルページをベースでまとめていきます。
ひとまず、このネタは今回で最終回となります。
※本記事はUnityの基礎知識及び、VR開発機材を持っている方が対象
選択したプラットフォームで理想とするフレームレートを維持し
「VR酔い」することないコンテンツを体験することが可能になる重要な要素となります。
レンダリングコストの面においてVRコンテンツの場合
1フレームのレンダリングで両目分の描画を行わなくてはいけません。
そのため通常のコンテンツ以上に
計算コストが必要になることを考慮しましょう。
また、最適化タイミングは
開発初期から定期的にターゲットデバイス上で行うことが最善となります。
ソースコードについても最適化することが必要があります。
詳細についてはこちらを参照してください。
https://developer.oculus.com/documentation/
http://static.oculus.com/sdk-downloads/documents/Oculus_Best_Practices_Guide.pdf
https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game/
https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game-continued/
プロファイラ
「レンダリング」「CPU」「メモリ」「オーディオ」「ネットワーク」で分割して
処理コスト(時間)がどれくらい掛かっているかを理解するのに役立ちます。
以下にプロファイラの使用方法について詳細が書かれております。
http://docs.unity3d.com/Manual/Profiler.html
https://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/profiler-overview
https://unity3d.com/learn/tutorials/modules/intermediate/editor/intro-to-profile
フレームデバッガ
フレーム内でどのような描画プロセスを行っているか確認することが出来ます。
これにより、1フレーム内での最適化すべき箇所を特定するのに役立ちます。
以下にフレームデバッガの使用方法についての詳細が書かれております。
http://docs.unity3d.com/Manual/FrameDebugger.html
https://unity3d.com/learn/tutorials/modules/intermediate/graphics/frame-debugger
※フレームデバッガでVRコンテンツを確認すると
両目分の描画を行っているのがわかります
一般的な最適化技術をそのまま応用することが出来ます。
以下に基本的な技術を紹介していきます。
ジオメトリ
可能な限りメッシュを簡略化するよう心がけましょう。
VRコンテンツの場合
ユーザー自身のモデルの顔部分は表示するが必要ないため
該当部分のメッシュデータは削除しましょう。
また、ユーザーから見えない箇所をレンダリングする必要もありません。
例) 食器棚の背面、建物の壁の先にある建物 etc
overdraw(重ね描画)
オブジェクトが重なって描画されている状態を確認することが出来ます。
可能な限り重なって描画されているところを削減するようにしてください。
Level of Detail
ハードウェアへの負荷を軽減することができます。
「Simplygon」というツールを使うことで
LOD技術に必要なリソースを自動的に作成してくれます。
Draw Call batching
Lightmapping
また、リアルタイムシャドウもやめましょう。
Light Probes
動的なオブジェクトに適用することが出来ます。
これはパフォーマンス的に比較的高速に動作し
視覚的な効果も大きく得られるものなので
VRコンテンツにも適した技術のようです。
Reflection Probes
処理コストが高いためVRコンテンツで使用する場合は
注意して使用するようにしてください。
Occlusion Culling
カメラの視点から見えていないオブジェクトのレンダリングを排除する機能で
パフォーマンスを大幅に向上させることが出来るため
積極的に取り入れていきましょう。
※キャプチャ画像は「République Tech Demo」より
Anti-Aliasing
オブジェクトのギザギザなエッジ部分を滑らかに表示する機能で、
VRコンテンツでは出来るだけ実装すべき機能だそうです。
※GearVRの場合、基本的にはこの設定が有効になっているそうです
Textures
テクスチャとマテリアルの数を削減しましょう。
便利ツールとして「MeshBaker」を使用することで、
簡単にテクスチャ及びマテリアル、
メッシュがベイクされパフォーマンス向上に繋がるそうです。
https://www.youtube.com/watch?v=9vZ8SfXOlpI
また、法線マップ(NormaMap)は
VRコンテンツとして不向きな技術のようで使用は避けたほうがよいそうです。
詳細は以下参照
https://developer.oculus.com/documentation/intro-vr/latest/concepts/bp_app_rendering/
Shaders
Quality Settings
品質重視 or パフォーマンス重視にするかは
ここの設定次第で大きく左右されます。
RenderScale
パフォーマンスを向上させることが出来る設定です。
Asynchronous Loading
シーン自体を分割するという方法もありますが
別シーンを読み込む際にヘッドトラッキングが行われない状態が発生すると
「VR酔い」に繋がるため「SceneManager.LoadSceneAsync」を使用し
非同期に別シーンを読み込みシーンロード中も
ヘッドトラッキングが行える状態を維持するようにしましょう。
・各プラットフォームで定められたフレームレートを下回ってはいけない
やはり、VRコンテンツの場合
「VR酔い」対策をちゃんと考えなければいけないですね。。。
※Unityの公式ページを元にしておりますが、
内容に不備がありましたらご連絡ください