Unityでの描画最適化について

最終更新日:2018年11月18日

UnityでHTC Vive、Oculus Rift対応ソフトを開発する際にフレームレートを確保する方法についてまとめています。

更新履歴

(2018年11月18日)Oculus UtilitiesをOculus Integrationに変更
(2018年2月4日)UnityEngine.XRに変更
(2017年1月12日)シングルパス・ステレオレンダリングについて追記
(2016年9月4日)Oculus RiftのAdaptive Resolutionについて追記
(2016年8月23日)「レンダリング解像度を下げる」を更新


プロファイラを使用する

Window>ProfilerでUnityのプロファイラを開くと、処理の重い部分を探すことができます。VRではGPUがボトルネックになっている場合が多いので、プロファイラパネルの左上からAdd Profiler>GPUでGPU使用率のペインを開いて確認します。

酔いや、没入感を阻害する原因となるため、VRアプリケーションはフレーム落ちを極力避ける必要があります。プロファイラのグラフにスパイク(負荷が瞬間的に増えること)がある場合は、原因を探して重点的に対策します。経験的には、Asset Storeのアセットのスクリプトには処理負荷が安定しないものが結構あるため(たとえば特定のタイミングで重いテクスチャやメッシュの生成を行うなど)、スパイクを起こすものを使っていないかどうか、早いうちにプロファイラで確認しておいたほうがいいと思います。

レンダリング解像度を下げる

GPUの描画負荷は、描画するピクセル数と、ピクセルあたりのシェーダの複雑さに基本的に比例します。GPUがボトルネックになっていてフレームレートが出ない場合、レンダリング解像度を下げると改善される場合があります。

using UnityEngine.XR;
...
XRSettings.renderViewportScale = 0.5f; // デフォルトは1.0f

また、Oculus RiftでOculus Integrationを使うと、GPUの使用率が高くなるとフレーム落ちしないように自動的に解像度を下げるAdaptive Resolutionという機能を使用できます。OVRCameraRigのOVR ManagerにあるEnable Adaptive Resolutionをオンにしてください。

シングルパス・ステレオレンダリング

各メッシュを左右同時にレンダリングしてドローコールを半減させる最適化機能があります。Virtual Reality Supportedを有効にするとその下に出てくるStereo Rendering MethodをSingle Passに変更すると使用できます。

書いた人:こりん(@korinVR
VR開発メモトップ