Unity
CPU
負荷対策

[Unity]CPU負荷 備忘録

More than 1 year has passed since last update.

最近行った負荷対策と、それぞれの効果について簡単にまとめました。
※効果については、基本的にプロジェクトによりけり。自身のケースではどのくらいだったかを基準にしてます

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で小まめに見ておく!