たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

OculusGoアプリのリリースに向けて行ったパフォーマンス・チューニングまとめ

Oculus Go でリリースする時にどうしても問題になるのが、パフォーマンス・チューニングです。今回のリリースで何を対応したか記載します。まず、常時60FPSは出ている必要があるために確認したところ、全シーンで30~40FPS程度しかでていなかったので、フレームレートが低いことを解消することを目的としました。

使用したツール / 環境

  • Unity 2017.3.1f1

最初にやったこと

現在のパフォーマンスと負荷の原因を確認する

まずは下記スライドのp68~を熟読します。読み終わったらまずはゲームロジック・描画処理のどちらの負荷が高いのか確認しました。

www.slideshare.net

※実機でのProfilerの確認方法は以下を参考に。
OculusGoで起動しているアプリのパフォーマンス情報をUnityのProfilerから確認する - たくあんポリポリ

ちょっと見づらいですが、緑のRendering処理のほうがOthersよりも大きいため、今回は描画処理の負荷のほうが高いと判断して、その削減を目指します。
f:id:c_taquna:20181123225743j:plain

さらに修正方針を検討

色々と調べていたところ、モバイル端末の場合DrawCallが200を超えたら修正をした方がいいとか、スマートフォンだとSetPassCallが100ぐらいが妥当だとか見つけたので、自分のアプリの状態を見てみたところ

f:id:c_taquna:20181123231251j:plain

こんなんになっていたので、まずはこの値を削減しようと思いました。
このSetPassCallとDrawCallの意味については、以下のURLでわかりやすく説明されています。
light11.hatenadiary.com

やった中で効果的だったこと

無駄な描画の削除

この記事を書いている時点で一番効果があったのは不要な描画の削除です。つまり、見えない部分のオブジェクトをひたすらに削除しました。下記URLにある、「オーバードロー」に該当します。
unity3d.com

表示をOverdrawに変更しながら不要な部分を削除しています。
f:id:c_taquna:20181123230543j:plain

f:id:c_taquna:20181123231251j:plain

f:id:c_taquna:20181124194625j:plain
これぐらいになるまで。今回は、OculusGoは3DoFなので自分の立ち位置が変わらないため基本見えないものはひたすら削除しました。これ以外にも後述の影の描画設定の変更などの対応をしているので、不要オブジェクト削除だけの結果ではないですが、「今回のケース」に関してはこの方法が一番ききました。

影の描画設定の変更

次に効果的だったのは、下記URLの「影を描画しない」「staticバッチングをする」を試しました。
nn-hokuson.hatenablog.com

船のモデルをアセットから使用していたので、そのモデルにだけ適応しましたが効果はありました。用語とか何をしているかは調べるとすぐに回答がみつかると思います。

やったけどそこまで効果がでなかったこと

設定の最適化

この記事にそって設定をしたけど、あまり効果はなかったです
Tech Note: Unity Settings for Mobile VR | Oculus

Occlusion Culling

Occlusion Culling を設定したけど、むしろ遅くなりました。処理の負荷の方が大きいのかな?あと、今回使用したモデルがあまりいい感じに分割されていなくて(自分視点のカメラが船の後方にあって、ほとんどのオブジェクトが視界に入ってしまっていたのでしょうがないと思いますが。。)効果が出なかったのかなと。
docs.unity3d.com

まとめ

現状フレームレートを改善することができた施策とそうでない施策を書きました。

結局のところ、まず何の負荷が高いのか、原因はなにでどう対応するのかを考えてから改善に取り組まないと、無駄どころか必要なものまで削って品質が落ちてしまう可能性が高いです。なのでとりあえず改善というよりは、ちゃんと調査して仮説をたてて検証していくことが重要かなと思いました。

感想

他にも良い方法があれば知りたい