きかいや。

機械といいつつだいたいプログラミングのはなし

PCVRからモバイルVRへの移植と最適化

日曜趣味プログラマみたいなものなので、
ガチのゲーム系開発者じゃない私が、PCパワーにあかせて動かしていたVRフライトシミュレータを
MirageSoloとかOculusQuestに移植するときに知ったこととかを書いていくメモです。

いきなり落ちる

このレベルだと実機ではプロファイラも使えないので、以下の方策を取る。
まずメモリの使い過ぎを疑う。
・PC向けビルドでもいいので、MemoryProfilerを見る。
・MSAAとかはアホみたい(数百MBとか)にメモリを食うのでまずは切る。
・Resousesの中身が膨れ上がっていないか?捨てて。
・AssetStoreで買ってきたモデルがやたらテクスチャリッチじゃないですか?解像度を下げる。
 解像度の高いテクスチャは片っ端から解像度を下げて、気になるやつだけ解像度を上げていったほうがいい。
・ビルドに含まれるファイルのサイズを調べて、要らなそうなのを捨てる
・Bakeしたシャドウも重い

動くようになってから

ガクガクでクソ重い場合

・Profilerを見てどこに食われているかを見る(実機が良い)
-Renderなら描画系(だいたいテクスチャがデカい。UIも意外とクソ重い)
 -Vsyncに食われてたらGPUが間に合ってない
 -Physycsに食われてたらColliderやFIxedUpdateの中身
 -Scriptに食われてたら個々のスクリプト見るしかない
・MemoryProfilerを見てどこが食ってるかを調べる
・LODはそのぶんモデルが増えるからメモリには優しくない。
切り替え判定も重いので意外とボトルネックになる…
・GPUInstanceingはGPUが間に合わなくなってボトルネックになることがあるので、
CPUに任せるかGPUに任せるかは線引きが必要。
・カリングも視界に入るかどうか?の判定処理が意外に重いので、切ったほうがいいこともある。
・PCでは気にならなかった物理のあたり判定がやたら重い。
 無駄なColliderを減らしたり、Layerを分けて干渉しないものの設定をして、あたり判定処理の回数を減らす
・フレームデバッガ―を見て、主にマテリアルを減らせ。
・仮置きした3DObjectがやたらある場合、メッシュをまとめろ

シーンロードで落ちる場合

・メモリがギリギリだと、シーン選択のシーンのメモリを保持してる余裕がない。
単体シーンを読み込むとなんとか起動するんだけど、
シーン選択画面からシーン遷移してくると落ちるんですよね。
LoadScene直後は両方のリソースを保持してるので限界超えて死んでること多い。

シーン遷移時は
1.選択画面からは空のダミーシーンを読み込んで、
2.シーン選択画面のリソースを破棄して、
次の重いシーンを読み込んで
という段階を踏むとメモリが割とあいた状態になるので何とかなったりする。