スマホゲーム(Android版)を作成した時に行なった軽量化の方法です。
アプリサイズの軽量化(容量削減)と処理速度の軽量化(高速化)があるけど、ごっちゃに書いてます。とりあえず忘れないためのメモとして。
Unity5.3.xです。
指標
●アプリサイズ確認方法(Windows)
C:\Users\(username)\AppData\Local\Unity\Editor\Editor.log
ビルドすると使用ファイル1つ1つのサイズまで記録される。使ってないアセットや画像が入ってないかもチェック。
●実行速度など確認方法
デバッグ実行中にエディターのGameタブにあるStatsをクリック。ここに表示されるFPSなどで速度をチェック。あとSetPassを減らすのが高速化への道。マテリアルをまとめると減るらしい。
1.スカイボックスのサイズ縮小
使用したスカイボックスがモバイル用ではなかったので、テクスチャの設定で縮小しました。あと床はどうせ見えないので、床テクスチャを削除。
スカイボックスは2種類使っていて、それぞれテクスチャを6枚→5枚に減らし、4MB→1MBに縮小したので、合計48MB→10MB!(圧縮前サイズ)
容量的にこれがいちばん効果あった。まあ、そもそもモバイルでスカイボックス使うべきじゃないけど。
2.動かないオブジェクトをStaticにする
処理削減で高速化します。
3.画像サイズを4の倍数にする
これ最初知らなかった。4の倍数にしないと画像が圧縮されません。
4.画像をシーン毎にSprite Packerでまとめる
Sprite PackerはかつてPro版にしかなかった機能で、スプライトのグループを指定すれば自動でまとめてくれる便利なやつです。大量にある画像を1つずつちまちま読み込むような無駄がなくなります。
SetPassもこれで減ります。
5.画像のミップマップを生成しない
GUI用の画像はミップマップ生成すると画質がガタガタになっちゃうので。そして生成するとその分容量も増えちゃうので。
6.GameObject.Find()をキャッシュする
Find()関数は重たいので、Update()の中でいちいちFind()呼ぶのは良くないみたい。なのであらかじめStart()の中でFind()して、その結果を変数に入れて(キャッシュして)、それをUpdate()で使います。
GetCommpornent()関数も重いらしいけど、今回はキャッシュしなかった。
7.フレームレートを30fpsにする
うちの古いノートPCだとフレームレート自動にしたらファンが唸りだすので、スマホでもフレームレート落としたほうがバッテリー節約されるはず。
Application.targetFrameRate = 30;
なんか自動のままの方がバッテリーに優しいと書いてる記事も見かけたけど気にしない。
8.解像度を下げる
スマホでキャプチャ撮ったら画像でかくてびびった。解像度が高ければその分描画処理も重くなるので、見栄えに影響ない程度に解像度を下げました。
具体的にはuGUIのCanvasとScreen.SetResolution()の両方とも1280×720にした。
9.影はハードシャドウを使う
ソフトシャドウよりハードシャドウの方が軽いです。
影は他にもShadow Resolution(解像度)やShadow Distance(距離)など影響ありそうなパラメータが多いです。
10.ベイク
ベイクすれば影の処理をゴッソリ軽減できるけど、今回のゲームはマップ自動生成なので使えず。ただ意外とベイクは容量食う。
11.SSAO使わない
うっかり使っちゃったのは俺だけか……結構解決するのに時間かかったんだけどね。
まとめ
やること多くて大変だ。たぶん他にももっとあるはず。
以下は公式から(2021/8/3)
・モバイルゲームのパフォーマンスを最適化しよう:専門家が語るグラフィックスとアセットに関するヒント