# 【对象池】

对象池可以减少对象频繁创建导致的性能问题,简单来说就是对象复用。

经典使用情景:

  1. 飞机弹幕。
  2. 列表项。
  3. 地图砖块。
using UnityEngine.Pool;

ObjectPool<GameObject> pool;

/// <summary>
/// 创建新对象时调用
/// </summary>
public GameObject CreateFunc()
{
    GameObject gameObject = Instantiate(XXX);
    return gameObject;
}

/// <summary>
/// 从对象池取出时调用
/// </summary>
public void ActionOnGet(GameObject gameObject)
{
    gameObject.SetActive(true);
}

/// <summary>
/// 回到对象池时调用
/// </summary>
public void ActionOnRelease(GameObject gameObject)
{
    gameObject.SetActive(false);
}

/// <summary>
/// 池溢出无法容纳对象时,对对象进行销毁
/// </summary>
public void ActionOnDestroy(GameObject gameObject)
{
    Destroy(gameObject);
}

private void CreatePool()
{
    // 回收时是否进行检查池里是否已经有这个对象
    // 设置成false可以获得更好性能,但要保证使用时确保对象的在池状态
    bool collectionCheck = true;
    // 初始池里的容量,通常设置成业务里对象最大数量,避免不断扩充池大小导致的性能开销。
    int defaultCapacity = 10;
    // 最大的池容量,超出后不回收保存,进行销毁处理
    int maxSize = 10000;

    pool = new ObjectPool<GameObject>(
        CreateFunc,ActionOnGet,ActionOnRelease,ActionOnDestroy,
        collectionCheck,defaultCapacity,maxSize);
}

文档API (opens new window)