UnityとOculusの話ですね。
Unity 5.4以降は VR Suppotの上でVR Supportを入れる。 MacでもOculusRuntime0.5.1入れるとDK2が使える(非推奨だけどね)
AudioManager→SpatializerをOculusSpatializerを指定してAudioSourceのSpatializeチェックを入れると、普通のパンよりも立体音響になって良い。
Oculus Platform SDKはいろいろある(が、OculusStore審査必須)
Oculus Utilities →Touch使ったりFoVいじったりするのに必要。おすすめ
Gear VRとRift CV1は1フレームあたり10倍違う
GearVRは1024x2のレンダリングを想定
トラッキングの高速化は凄い
Time Warp→20msほどphotonのlatancyが速くなってる。直前のIMUの値で絵を動かしてる。フレームドロップが許されない。
Asynchronous Time Warp→Renderingの絵をずーっと描いて、書き終わった次のWarp(VSync)で絵を出す。VSyncは90Hzで固定できてる。つまり、45FPSモードの時は同じフレームの絵を頭の傾きに合わせて2回づつ描画してる。 これをポジショントラキング側まで拡張したのがAsynchronous Space Warp
Instanced Stereo Rendering→Single Path Stereo Renderingのこと,DX11から使えます。GTX10x0からはさらに無茶出来ますね。AndroidでもGLESのextensionのMultiViewでサポート。
最適化はどこまで?→やればやるだけ。GearVRは39度以上でサーマルスロットリングorz
5秒に1フレーム以上落ちてるとき: Render Timeが8ms以内ならCPU側を改善、そうでないならGPU側を改善。 OculusPerfHUDはこれらの切り分けがしやすいので、ビルドしたら試してみると良いです。ほとんど処理負荷を与えずに観測できます。
そもそもUnityで作る時に Batchが1000以上、頂点が200万ポリゴン超えてる、SetPassCallが100を超えてたら危ないと思ってください。(うひー厳しい)
それらを守れていない場合は、Unityのプロファイラでボトルネックを切り分けます。shadowなのかmesh renderingなのかvsync(これはそんなに問題じゃない)なのか
問題のシーンから一部のアセットだけを切り出した小さなシーンを作って試すのは良いことです。
また、最近のUnityのプロファイラはTimelineViewというモードがあって、1フレームの内、処理順やボトルネックが理解しやすいです。
GCのスパイクが起きてる場合は、メモリを毎フレーム確保するようなコードを書かない(たとえば、マテリアルのインスタンスを毎フレーム生成するとか)
新しいUnityではGameViewタブで右クリックしてRenderDocビューが出せます。 (Unity frame debuggerみたいなやつ?)
ETW+GPUView(Riftのみ)とかOVRMonitor(GearVRのみ)とかSnapdragon profilerとかもある。(すごい、このへん使ったことないや)
一番重い部分を速くするという原則は変わりません。
staticチェック入れる。ライトを焼く。マテリアルを共通化する。SinglePathStereoにする。
Billboardを使う(5.5以降はVRで見ても良い感じになったはず) Mipmapを常に生成する MeshのLODを使う(あー、simpolygonがほしい)
Gear VRはTextureのfillrateが問題になります。 MSAAはx2まで、 Singlepath foward renderingが必須。
RenderScale 1.4はAAも効く、Riftの初期設定です。 1.0→0.5で1/4まで描かなきゃいけないピクセルが減るのでパフォーマンスが凄く稼げます。
OVRManagerにbool enableAdaptiveResolutionというのが定義されてて、これをtrueにするとRenderScaleを自動で調整してくれます(めっちゃ便利だ…)