最近行った負荷対策と、それぞれの効果について簡単にまとめました。
※効果については、基本的にプロジェクトによりけり。自身のケースではどのくらいだったかを基準にしてます
GetComponentの呼び出しを抑える(効果:大)
取得したインスタンスを変数にキャッシュして、呼び出しを最低限に抑えること。
特に、Update内やfor文内で呼ばれるとかなりな処理時間に。メソッド内で使う場合、気付き辛いので注意。
Distanceやmagnitudeなど、距離やベクトルの長さの計算改善(効果:大)
必然性が無ければ、極力使わないほうがよい。
例えば、2点間の距離の比較であればsqrMagnitude同士を比較することでも可能で、
sqrMagnitudeはmagnitudeやDistanceにくらべ、√の計算をせず、2乗した値のままであるため負荷が低い。
transformのposition、eulerAnglesへの代入改善(効果:小~中)
可能ならlocalPosition、localEulerAngles(rotation)への代入の方が軽い。
positionなどに代入すると、ローカル座標へ変換する処理が走るらしく、数が増えてくると地味に重くなる。
また、1フレーム内での計算で、transformへの代入が何度もあるとそれも無駄な負荷になるため、最終的な座標や角度のみをtransformに代入するように設計すること。
Animatorコンポーネント(効果:大)
少ないほど良い。3Dモデルのモーションなどでは使用は避けられないが、単純にくるくる回ったりバウンドするだけのUIやアイテム系であれば、スクリプトで実装してUpdateを回した方が速い。Animatorだとパラメータ管理などでUpdate処理の負荷が膨らむ模様
ボタンのタッチリリースや、点滅、拡縮などの汎用UIアニメーション、3Dオブジェクトの回転などのループ系アニメーションは、必要最低限用意しておいて、AddComponentですぐ使えるようにしておきたい。
AnimatorのSetBool、SetTrigger(効果:小~中)
値の変化が変わらないのに、Update内で何度もSetメソッドを呼んでいると、無駄な負荷になる。
Set前に比較をして、変わらない場合はSetしない方が軽い。
これはAnimator以外にも、SetStateやSetActive、SetVisibleなどのいろんなSet系メソッドのことで言える。
Animation付きのfbxのOptimize(効果:中~大)
http://tsubakit1.hateblo.jp/entry/2015/04/30/012956
Unity上で参照が必要ないボーンを隠す機能。Animators.Updateの処理負荷に効果がある。
特にキャラクターモデルのようにボーン数が多いものだと効果が大きい
参照が必要なものは、「Extra Transforms to Expose」で選択しておくこと
ログの出力負荷(効果:小)
リリースビルドでDebug.Logを消してなければ消す
┣ namespaceを分けてプロジェクト内で呼ぶDebug.logをオーバーライド
┣ namespace毎に出すログをON/OFFする
┗ System.Diagnostics.ConditionalのAttributeを使って整理するのもオススメ
http://d.hatena.ne.jp/nakamura001/20151202/1449029637
自身で入れているLog以外にも、Assetが大量にログを履いていたり、StarckTraceに格納?してたりする場合も
CanvasRaycasterの負荷(効果:中)
「Canvas Raycaster」が設定されているキャンバスの、UI要素数が多いほど、RaycastAllの処理(EventSystemを使っている以上避けられない処理)の負荷が大きくなる。
「Raycast Target」がtrueになっているUIを極力別のCanvasにまとめることで負荷を減らせる。
ガベージコレクション(効果:中~大)
明示的に変数を解放せずGCに任せると、一定のタイミングでGCの処理負荷がかかり、FPSが落ちる。
インスタンスを扱うローカル変数の扱いにコーディングルールを決めて対策すること。
画面内に映らないUIの負荷(効果:大)
よくあるモノだと、キャラクターの付近に表示するHPゲージや名前、照準などが該当。
3Dオブジェクトを追従して表示するようなUIの場合、画面外にいるときは描画もスクリプトも原則OFFにしておきたい。
GPU Skinning(効果:小)
GPU負荷よりCPU負荷の方が高い場合に有効。SkinningをGPUに任せる設定をしている。
PlayerSettingsのOtherSettings内で指定可能。
その他
・ダメージ数字やエフェクト、敵の攻撃の弾など、頻繁に出たり消えたりするオブジェクトを都度生成せず、使いまわすようにしたり、必要なリソースをシーン開始時などにまとめてロードしておくことも重要
・Photonなどでリアルタイム通信をする場合は、出来る限り通信データ量を減らしたり、通信する処理をまとめたりしておく
負荷の原因は他にもいろいろ考えられるので、Profilerで小まめに見ておく!