Create a gist now

Instantly share code, notes, and snippets.

Unite 2016の同名の講演を見ながら書いた殴り書きです https://www.youtube.com/watch?v=kGCS8LqXJ4o

UnityとOculusの話ですね。

Enabling VR in Unity

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いじったりするのに必要。おすすめ

VR Concepts

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

Measuring Performance

OculusPerfHUD

5秒に1フレーム以上落ちてるとき: Render Timeが8ms以内ならCPU側を改善、そうでないならGPU側を改善。 OculusPerfHUDはこれらの切り分けがしやすいので、ビルドしたら試してみると良いです。ほとんど処理負荷を与えずに観測できます。

そもそもUnityで作る時に Batchが1000以上、頂点が200万ポリゴン超えてる、SetPassCallが100を超えてたら危ないと思ってください。(うひー厳しい)

それらを守れていない場合は、Unityのプロファイラでボトルネックを切り分けます。shadowなのかmesh renderingなのかvsync(これはそんなに問題じゃない)なのか

問題のシーンから一部のアセットだけを切り出した小さなシーンを作って試すのは良いことです。

Unity Timeline View

また、最近のUnityのプロファイラはTimelineViewというモードがあって、1フレームの内、処理順やボトルネックが理解しやすいです。

GCのスパイクが起きてる場合は、メモリを毎フレーム確保するようなコードを書かない(たとえば、マテリアルのインスタンスを毎フレーム生成するとか)

Unity RenderDoc

新しいUnityではGameViewタブで右クリックしてRenderDocビューが出せます。 (Unity frame debuggerみたいなやつ?)

その他

ETW+GPUView(Riftのみ)とかOVRMonitor(GearVRのみ)とかSnapdragon profilerとかもある。(すごい、このへん使ったことないや)

Fixing Bottlenecks

一番重い部分を速くするという原則は変わりません。

Vertex/Batch スループット

staticチェック入れる。ライトを焼く。マテリアルを共通化する。SinglePathStereoにする。

Billboardを使う(5.5以降はVRで見ても良い感じになったはず) Mipmapを常に生成する MeshのLODを使う(あー、simpolygonがほしい)

Pixel/Texture Bandwidth

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を自動で調整してくれます(めっちゃ便利だ…)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment