はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity GameObject.Find系が重い理由

あいさつ

どうも、はかせです。
よく「UnityのGameObject.Findは重い」っていう話を聞きます。
あくまで私が知っている範囲では重いとはいっても重い理由は出てないことが多いです。
ということで私が知っている理由と使っていい場面、使っちゃダメな場面をまとめたいと思います。

重い理由

理屈は単純です。
GameObject.Findはヒエラルキーの全走査を行うからです。

ヒエラルキー上のオブジェクトの数だとかにもよると思いますが
なんであれ全走査するものってのは総じて重くなりやすいものですから
GameObject.Findが重いって言われるのも納得です。

使っていい場面

※あくまで私が考えるものです

私がGameObject.Findを使う場面は大きく分けて二つです。
・Startなど一度もしくは少数しか呼ばれない場合
・エディタ拡張などランタイムで走らないもの

一つ目はそんなたくさんしないなら許容してもいいんじゃないって考えです。
結局初回ロードとかの時はどうしても重くなっちゃうので
パフォーマンス的に許容可能ならば数回使用するのはいいと思います。

結局使いたくない理由ってパフォーマンスの低下が主な理由なので
そこに触れない程度であれば使うのはいいと思います。
(まぁ捜索が名前の完全一致なのが気に食わないのでTag検索とかのが使いますが)

二つ目はランタイムで走らないならパフォーマンスを気にする必要がないからです。
特にエディタ拡張とかなら検索窓とか入れれば
名前の完全一致とかも大して気にならないと思いますし、
ダメな部分、気に入らない部分全部まとめて解決してるのでこっちではガシガシ使いますw

使っちゃダメな場面

Update系の関数の中で呼ぶこと

ランタイムで高頻度で呼んじゃダメっていってんだろ!!!って話ですw
目に見えてFPSが落ちていきますw

あと高頻度で発生するならOn○○系で呼ぶのもダメな、
これもパフォーマンス落ちるから。
(はかせはどうやら嫌な思い出があるようだ)

ふぅ・・・ふぅ・・・すみません、取り乱してしまいました。
とにかくランタイムで高頻度で使うのはやめましょう。

おい!こら、そこ!ランタイムで使うなって言ってんd・・・

あとがき

今回はGameObject.Findについてでした。

乱用は危険ですが乱用しなきゃ楽にGameObjectが取れる便利関数です。
用法と用量を守って正しく使いましょう。

それでは今回はこの辺でノシ