こんにちは!SH研究所です!
私がつくった格ゲー シャイニーハートですが、スマホ上で動かしたらフレームレートが低くて困ったことがあります。
この時、unityのプロファイラを使って原因を見つけ、解決することができました。
今回は、その時のお話をします!
原因:フレームレートが低い原因は複数カメラ!
フレームレートが低い原因は、カメラを複数使用していたことが原因でした。カメラを減らすことで問題が解決しました。
詳細:格ゲーをスマホで動作したらフレームレートが低い!
格ゲーを、スマホ上で実行してみました。しかし、安定して60FPSでていませんでした。
フレームレート:1秒間に画面に表示する画像の枚数
FPS :「Frames per second」の略で、フレームレートの単位
60FPSなら、1秒間に60枚の画像を画面に表示する。
上図は、60FPS以内におさまっていますが、実際は安定して60FPSでません。
上図は、処理が重い Renderingと、Scriptsだけを表示しています。しかし、実際にはAnimation、UI等の処理も加算され、さらにフレームレートが低下します。
現状だと、ギリギリで動作している状態!
シャイニーハートのフレームレートは、60FPSで動作する仕様です。
60FPSで動作させるためには、1フレームを約16ms以内で全ての処理を完了しなければなりません。
unityプロファイラで原因解析!
こんな時は、手あたり次第に試してみるより、unityの便利機能「プロファイラ」を使いましょう!
今回は、一番処理が重いRenderingと、Scriptsに注目しました。一番処理が重い箇所を改善できれば、一気に問題解決できる可能性があるためです。
プロファイラを使って、犯人をあぶりだす
プロファイラで気になるところ発見!
プロファイラを確認していると、気になるところを発見しました。
各カメラの処理時間が、ほぼ同じ(1msくらい)
ゲーム上では、カメラを複数使用しています。
- キャラ1P用
- キャラ2P用
- 背景用
- HPゲージ用
- その他ゲージ用
私の認識では、キャラクタ、背景はポリゴン数も多く、シェーダも重いので、これらを処理しているカメラは高負荷、HPゲージ等は低負荷で処理される。
しかし、どのカメラも処理時間が、ほぼ同じでした。何で?
実際にカメラを減らしたらどうなるか?
プロファイラを確認した結果、カメラを複数を使用していると高負荷になることが分かったので、カメラを1台にしてみました。
カメラ複数 使用時の処理時間
カメラ1台 使用時の処理時間
複数カメラ使用時の処理時間 9.55 ms
カメラ1台使用時の処理時間 2.07 ms
差分 9.55 – 2.07 = 7.48 ms
かなり改善されました!
実際にスマホ上のフレームレートも、安定して60FPSでるようになりました。
グラフ比較
グラフからも処理が軽くなったことが分かります。
犯人はお前だ!
Unity ブログでも、カメラを複数使用する場合、パフォーマンスが低下する内容が記載されています。
Unity ブログ カメラの使い方を工夫してゲームのパフォーマンスを最適化する方法:パート 2
https://blog.unity.com/ja/games/part-2-optimize-game-performance-with-camera-usage
フレームレートが低い原因 まとめ
カメラを複数使うと、処理が重くなり、フレームレートが低下することが分かりました。
カメラを減らすことで、フレームレートが低下する問題を改善できることが分かりました。
スマホ上で期待したフレームレートが出ない時は、カメラの使用数を減らしてみると改善する可能性がありますので、試してみてください!
参考:動作環境
使用スマホ:Google Pixel 4a(Android 11)
unity:Ver.2021.1.24f1(Windows 10)
コメント