LoginSignup
36
42

More than 5 years have passed since last update.

[Unity]CPU負荷 備忘録

Posted at

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

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

36
42
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
42