#概要
Unity5世代+ OVRSDK0.5.0 + Oculus Runtime0.5
という環境で、MMDモデルを鑑賞したりする感じのコンテンツでのパフォーマンス調整をしてみます。
#動作環境
ターゲット:GeForceGTX870M を搭載したOptimusなWindows ノートPCで75FPS
手元にGeforce GTX860Mがあったので、これで75FPS出せるようにしておけば、おそらく大丈夫でしょう。
Optimusノート向けのOculusRiftコンテンツ開発については
現時点でもこのエントリを踏襲することになります。
2015/8現在のOculusRift+UnityのノートPC対応 開発動作環境構築
http://izm-11.hatenablog.com/entry/2015/09/02/201003
#Unityバージョン問題
調子に乗って5.2.2p4をインストールしたらOculusRuntime0.5では何をやっても動かないという罠があったのでダウングレードします。
(画面が真っ黒になります)
5.0.3p3にしましたが、5.1.x系でも大丈夫だったと思います。
#パフォーマンスチェック
##1.シーンのTerrainの負荷チェック
Terrain+OVRPlayerControllerだけのシーンを作り、75FPS張り付きなことを確認します。
OVRCameraRigにOVRMainMenuがアタッチされていれば、ビルドして実行したときにスペースキーを押すことでメニューが表示され。FPSが確認できます。
##2.MMDキャラクタを含む全体シーンの負荷チェック
そのまま、まずはシーン全体でビルドして、(ExtendModeでDirectToRift.exeで起動して)FPSを表示しながら見てみます。
このときに、歩き回り見回しながら、壁を向いたり天井を見たり、地面を向いたりして、描画負荷を変えながら、どうするとFPSが落ちるか観察します
例えばありがちなのは
- 空を見たり床を見ているときは75FPS出ていて、後ろや横を向いていても75FPS
- ただし正面を見ていると60FPSくらいに下がる
- 試した感じでは、キャラクターを視界に入れていると75FPSを割ることが分かる
みたいなパターンでしょうか。一般的にGeForceGTX860MではMMDキャラクター3人出ていると大体負荷は限界です。
##3.FPS落ちの原因はCPUかGPUか判断する
エディタモードでProfilerを起動しながらシーンを再生してみます。
大体の場合、黄緑の部分が大きいことが分かります。これはレンダリング(GPU)が重い状態です。
物理演算や、AI部分が重い場合は、水色が大きくなります。余談ですが上のスクリーンショットだと**Camera.Renderだけで70%**を占めてます。
よって、GPU負荷を減らすことにします。
##4.お手軽なGPU負荷軽減
OvrCameraRigを以下のように変更します。
- Native Texture Scaleを 1 → 0.7 に(フレームバッファサイズを小さくする)
- Eye Texture Anti Aliesを 2 → 1 に(アンチエイリアスを切る)
- Monoscopicのチェックを入れる(両目に同じ絵を映す)
これで再度ビルドして、2.の手順でFPSが出ているかチェックをしてみます。
これで75FPS出ていれば、 Monoscopicを元に戻す→Native Texture Scaleを1に戻す と言う感じに元に戻しながら負荷を見極めていきます。
もし、上記のチェックをしても未だ75FPS出ていない場合は、いよいよ細かいUnityのパフォーマンスと戦うことになりますが、割とこのOvrCameraRigの設定だけでも描画負荷は結構変わります。お試しください。
##補足Unity VR Supportを使っている場合
- Native Texture Scaleの代わりにこちら http://docs.unity3d.com/ScriptReference/VR.VRSettings-renderScale.html
- Monoscopicチェックボックスの代わりに OVRManager.instance.monoscopic の値をtrueまたはfalseに
となっています。
こちらで Unity VR Supportを使用している時のプロファイラの読み方も書かれているので併せてお読みください。
UnityのVRサポートでパフォーマンスとかプロファイルとか
http://udasankoubou.blogspot.jp/2015/11/unityvr.html