2012年8月2日木曜日

最適化のお話

最適化についてまとめます。
特にiPhoneやAndroid向けに開発する場合は悩まされる部分ではあります。
Unityに限らず役に立つ部分もあるかもしれません。

まず最適化を行う上で意識すべきことはキャッシュすることです。
毎ループごとにGetComponent()しているような部分はStartであらかじめキャッシュすることで無駄な処理を省くことができます。
また、ComponentだけではなくFind()で探しているオブジェクトや、結果が変わらない計算等はキャッシュするのが基本です。

ほかにもRaycastのキャッシュも効果があります。Raycast自身を無意識で使用してしまうととんでもないネックになることがほとんどです。LayerMaskを指定して判定を行うオブジェクトを少なくすることは当然ですが、一度判定が取れたのならばその判定をキャッシュしておきRaycastHit.colliderからコライダのRaycastを使用するようにしましょう。
Physics.Raycastが全てのコライダと判定をとろうとするのに対してCollider.Raycastではコライダ自身との判定をとるだけなので圧倒的にコストが変わると考えられます。

キャッシュの他にはUpdateおよびFixedUpdateで処理する内容に注意する必要があります。特にFixedUpdateは単位時間あたりに呼び出される回数がUpdateよりも多いので、気をつけないと非常に危険です。とくに前述のRaycastと複合されてしまうと非常に大きなネックとなります。

最後にベクター系クラスのmagnitudeには気をつける必要があります。ベクトルの大きさを求める際には三平方の定理からもわかりますが、平方根の計算を行う必要があり、それには地味に負荷がかかります。単にベクトルの大小比較を行うだけであればsqrMagnitudeを使用しましょう。こちらの値は最後に平方根をとる部分が除かれているすなわち大きさの二乗の値が取れることになり、x < y ならば x^2 < y^2 となるので単純な大小比較だけであればこちらで問題ありません。

今回はプログラムを中心にまとめました。
バッチやDrawcallなどプログラム以外に深く関わっている部分に関しては後日まとめます。

0 件のコメント:

コメントを投稿