コンテンツにスキップ

Object Pool

頻繁に生成・破棄されるオブジェクトを再利用し、割り当てコストと GC スパイクを減らすパターンです。

  • 弾やエフェクトを大量に生成・削除するとき
  • モバイルで GC の跳ねを減らしたいとき
  • Pool: 再利用保管庫
  • Get: 取り出し
  • Release: 返却

以下のコードは、上で説明した状況を Unity プロジェクトの文脈で単純化した例です。

using UnityEngine;
using UnityEngine.Pool;
public sealed class ProjectilePoolController : MonoBehaviour
{
[SerializeField] private GameObject projectilePrefab;
private ObjectPool<GameObject> projectilePool;
private void Awake()
{
projectilePool = new ObjectPool<GameObject>(
createFunc: () => Instantiate(projectilePrefab),
actionOnGet: projectile => projectile.SetActive(true),
actionOnRelease: projectile => projectile.SetActive(false),
actionOnDestroy: projectile => Destroy(projectile),
collectionCheck: false,
defaultCapacity: 32,
maxSize: 256
);
}
public GameObject SpawnProjectile(Vector3 spawnPosition)
{
GameObject projectile = projectilePool.Get();
projectile.transform.position = spawnPosition;
return projectile;
}
}
  • Instantiate / Destroy の頻度を下げ、GC スパイクやヒッチを減らせます。
  • 最大オブジェクト数を制御しやすく、性能予算を見積もりやすくなります。
  • 返却漏れがあるとプール枯渇や不要なメモリ増加につながります。
  • 再利用オブジェクトの状態初期化を忘れると、前フレームのデータが混ざるバグが起きます。

オブジェクトを再利用して割り当てと解放を減らす管理フローです。

Object Pool の流れ