Unity5.3のVRアプリ最適化

前回に引き続き、VR用公式チュートリアルネタです。

今回はUnityにおけるVRアプリの最適化について
UnityのVR用公式チュートリアルページをベースでまとめていきます。

ひとまず、このネタは今回で最終回となります。

※本記事はUnityの基礎知識及び、VR開発機材を持っている方が対象

はじめに
VRコンテンツにおける最適化は
選択したプラットフォームで理想とするフレームレートを維持し
「VR酔い」することないコンテンツを体験することが可能になる重要な要素となります。

レンダリングコストの面においてVRコンテンツの場合
1フレームのレンダリングで両目分の描画を行わなくてはいけません。
そのため通常のコンテンツ以上に
計算コストが必要になることを考慮しましょう。

また、最適化タイミングは
開発初期から定期的にターゲットデバイス上で行うことが最善となります。

ソースコードについても最適化することが必要があります。
詳細についてはこちらを参照してください。

Oculus公式リソースリンク
Oculusの公式サイトにも最適化の情報が多くあるので参考にしてください。

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/

Unityエディタ最適化ツール紹介
UnityにはVRコンテンツを最適するのに役立つツールが多く存在しています。

プロファイラ

プロファイラは各フレーム毎に、
「レンダリング」「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

unity-profiler

フレームデバッガ

フレームデバッガは1フレーム単位で
フレーム内でどのような描画プロセスを行っているか確認することが出来ます。
これにより、1フレーム内での最適化すべき箇所を特定するのに役立ちます。

以下にフレームデバッガの使用方法についての詳細が書かれております。

http://docs.unity3d.com/Manual/FrameDebugger.html

https://unity3d.com/learn/tutorials/modules/intermediate/graphics/frame-debugger

unity-frame-debug
※フレームデバッガでVRコンテンツを確認すると
両目分の描画を行っているのがわかります

VRにおける最適化の基本
VRにおける最適化も
一般的な最適化技術をそのまま応用することが出来ます。
以下に基本的な技術を紹介していきます。

ジオメトリ

ターゲットプラットフォームに応じて以下のような方法で
可能な限りメッシュを簡略化するよう心がけましょう。

VRコンテンツの場合
ユーザー自身のモデルの顔部分は表示するが必要ないため
該当部分のメッシュデータは削除しましょう。

また、ユーザーから見えない箇所をレンダリングする必要もありません。
例) 食器棚の背面、建物の壁の先にある建物 etc

overdraw(重ね描画)

Unityの「Scene」ビューの「Overdraw」では
オブジェクトが重なって描画されている状態を確認することが出来ます。
可能な限り重なって描画されているところを削減するようにしてください。

unity-overdraw-01
※Shading Mode 「Shaded」

unity-overdraw-02
※Misellaneous 「Overdraw」

Level of Detail

LODはカメラとの距離によりオブジェクトのポリゴン数を減らす技術のことで、
ハードウェアへの負荷を軽減することができます。
Simplygon」というツールを使うことで
LOD技術に必要なリソースを自動的に作成してくれます。

Draw Call batching

ドローコールのバッチ処理は、パフォーマンスを劇的に向上させることが出来ます。
詳細はUnityのガイドを参照してください。

Lightmapping

可能な限り動的なライティングは行わず、焼きこむ(bake)ようにしましょう。
また、リアルタイムシャドウもやめましょう。

Light Probes

ライトプローブはシーン内のポイント照明として
動的なオブジェクトに適用することが出来ます。
これはパフォーマンス的に比較的高速に動作し
視覚的な効果も大きく得られるものなので
VRコンテンツにも適した技術のようです。

Reflection Probes

リフレクションプローブは現実的な反射を再現することが出来る機能ですが
処理コストが高いためVRコンテンツで使用する場合は
注意して使用するようにしてください。

Occlusion Culling

オクルージョンカリングは、
カメラの視点から見えていないオブジェクトのレンダリングを排除する機能で
パフォーマンスを大幅に向上させることが出来るため
積極的に取り入れていきましょう。

unity-occlusionCulling-01
※Occlusion Culling 「OFF」

unity-occlusionCulling-02
※Occlusion Culling 「ON」

※キャプチャ画像は「République Tech Demo」より

Anti-Aliasing

アンチエイリアシングは、
オブジェクトのギザギザなエッジ部分を滑らかに表示する機能で、
VRコンテンツでは出来るだけ実装すべき機能だそうです。
※GearVRの場合、基本的にはこの設定が有効になっているそうです

Textures

基本的に「テクスチャ」のアトラス化を行い、
テクスチャとマテリアルの数を削減しましょう。
便利ツールとして「MeshBaker」を使用することで、
簡単にテクスチャ及びマテリアル、
メッシュがベイクされパフォーマンス向上に繋がるそうです。
以下のリンクで「MeshBaker」について語られています。

https://www.youtube.com/watch?v=9vZ8SfXOlpI

また、法線マップ(NormaMap)は
VRコンテンツとして不向きな技術のようで使用は避けたほうがよいそうです。

詳細は以下参照
https://developer.oculus.com/documentation/intro-vr/latest/concepts/bp_app_rendering/

Shaders

GearVRの場合、基本的なシェーダーのみ使用することを推奨するそうです。
また、フルスクリーンエフェクトは高価な表現となるため
GearVRの場合使用を避けたほうよいでしょう。

Quality Settings

プロジェクト全体の品質を設定することが出来ます。
品質重視 or パフォーマンス重視にするかは
ここの設定次第で大きく左右されます。

RenderScale

シャープな表現を犠牲にする代わりに
パフォーマンスを向上させることが出来る設定です。

Asynchronous Loading

パフォーマンス向上させる方法として、
シーン自体を分割するという方法もありますが
別シーンを読み込む際にヘッドトラッキングが行われない状態が発生すると
「VR酔い」に繋がるため「SceneManager.LoadSceneAsync」を使用し
非同期に別シーンを読み込みシーンロード中も
ヘッドトラッキングが行える状態を維持するようにしましょう。

 

まとめ
・3Dコンテンツと同様の最適化は、VRコンテンツにも活かせる
・各プラットフォームで定められたフレームレートを下回ってはいけない

やはり、VRコンテンツの場合
「VR酔い」対策をちゃんと考えなければいけないですね。。。

※Unityの公式ページを元にしておりますが、
内容に不備がありましたらご連絡ください