(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Colliderを一つのGameObjectにまとめた場合と、ColliderごとにGameObjectを分けた場合の負荷比較【Unity】【最適化】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2017.4.0f1


はじめに

Unityで当たり判定を実装する時にはCollider(2D)を使いますが、

Colliderを複数付けたい場合に、一つのGameObjectにColliderをまとめて付けた場合


f:id:kan_kikuchi:20180401080819j:plain


ColliderごとにGameObjectを分けた場合とで、


f:id:kan_kikuchi:20180401080827j:plain


負荷の差がどの程度になるかって気になりませんか?

なんか気になってしまったので、調べて見ました!


なお、今回は2Dでの比較を行っています。(おそらく3Dでも同じ結果だとは思います。)


静止状態での比較

まずはColliderが動いていない状態での比較です。


以下のようにRigidbody2Dが付いておらず、静止状態のコライダー群

別の運動状態のコライダーが落ちて来る場合のFPSを測って比較を行います。


f:id:kan_kikuchi:20180401153702g:plain


比較は実機上(Mac)で行い、

FPSは起動後からちょっと間を置いて測り始めた平均のモノを使いました。


実際に計測した結果は以下の通りです。

Colliderの数 平均FPS
10000個(まとめた場合) 59.78
10000個(分けた場合) 60.4
11000個(まとめた場合) 59.15
11000個(分けた場合) 60.03
12000個(まとめた場合) 41.03
12000個(分けた場合) 60.01
13000個(まとめた場合) 14.58
13000個(分けた場合) 60.04
14000個(まとめた場合) 3.00(ほぼフリーズ)
14000個(分けた場合) 60.02
20000個(まとめた場合) 3.00(ほぼフリーズ)
20000個(分けた場合) 59.60
30000個(まとめた場合) 3.00(ほぼフリーズ)
30000個(分けた場合) 17.27


上記の通り、一つのGameObjectにまとめた場合の方がよりFPSが落ちており、

負荷が高い事が分かるかと思います。


運動状態での比較

次にColliderが動いている状態での比較です。


以下のようにRigidbody2Dが親に一つ付いている、運動状態のコライダー群

別の静止状態のコライダーに落ちていく場合のFPS測って比較を行います。


f:id:kan_kikuchi:20180401165617g:plain


比較は実機上(Mac)で行い、

FPSはコライダー衝突時の最低のモノ(そこだけ極端に下がるため)を使いました。


実際に計測した結果は以下の通りです。

Colliderの数 最低FPS
7000個(まとめた場合) 44.74
7000個(分けた場合) 57.68
8000個(まとめた場合) 40.03
8000個(分けた場合) 55.51
9000個(まとめた場合) 15.23
9000個(分けた場合) 52.54
10000個(まとめた場合) 3.64
10000個(分けた場合) 50.16


こちらも先ほどと同様に、一つのGameObjectにまとめた場合の方がよりFPSが落ちており、

負荷が高い事が分かるかと思います。


おわりに

という事で、今回の比較ではColliderを複数付けたい場合は、

ColliderごとにGameObjectを分けた方が軽いという結果になりました。


実は比較前には逆の予想をしていて、その理由が以下の記事で、

ざっくり言うとTransformが(特に子に)多いほど重くなるという話です。



Transformが多いほど重くなるなら、Colliderも一つのGameObjectに付けた方がTransformが減り、

軽くなると思ったのですが、Colliderを付けた場合(当たり判定をする場合)は話が別なようです。


なお、プラットフォームやUnityのバージョン、

コライダーの形や種類等でも結果が変わるかもしれないので注意が必要です。