ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Unity】Object Pool の注意点

Object Poolとは?

オブジェクトを事前生成して使い回す手法です。
インスタンス生成によるCPU負荷(スパイク)を抑えるメリットがあります。

何度も使い回すオブジェクトに適用します。
(例:シューティングゲームのミサイル・レーザーなど)

Unity2021.3以降であればUnity標準のObjectPoolが使えます。
Unity - Scripting API: ObjectPool<T0>

注意点

Object Poolはポピュラーな最適化手法として話題になりますが幾つか注意点もあります。

初期化・終了の仕方

都度生成・破棄の場合、Unityにおける初期化はAwake(), Start(), 終了処理は OnDestroy() に記述しますが、ObjectPoolの場合、オブジェクトのアクティブ切り替えによる使い回しになるため 初期化は OnEnable(), 終了処理は OnDisable() に記述するなどの工夫が必要です。

UnityのOjectPoolを使う場合はコンストラクタで各種コールバックを指定できます。
Unity - Scripting API: Pool.ObjectPool_1.ObjectPool<T0>

メモリ使用量

オブジェクトを事前生成するため、都度生成・破棄と比較してメモリ使用量が増えます。

例えば、画面にミサイルが5個しか出ないのに、100個事前生成するなど必要以上に確保してメモリを圧迫する設計にしない注意が必要です。

プール作成のタイミング

特定フレームにまとめてオブジェクトを生成するため、そのタイミングでスパイク発生のリスクがあります。画面遷移や暗転時に生成を行うなどの工夫が必要です。

まとめ

Object Pool の注意点をまとめてみました。ゲーム仕様によっては上記以外の注意点も出てくると思うので上手く活用して快適に遊べるゲームを作れると良いですね ^_^