对象池

1 一个基本的实现初始化和重置功能的对象池

public sealed class ObjectPool<T>  
    where T : class, new()  
{  
    private Queue<T> m_objectQueue;  
  
    private Action<T> m_resetAction;  
    private Action<T> m_onetimeInitAction;  
  
    public ObjectPool(int initialBufferSize,  
        Action<T> ResetAction = null,  
        Action<T> OnetimeInitAction = null) {  
  
        m_objectQueue = new Queue<T>(initialBufferSize);  
        m_resetAction = ResetAction;  
        m_onetimeInitAction = OnetimeInitAction;  
    }  
  
    public T New() {  
        if (m_objectQueue.Count > 0) {  
            var t = m_objectQueue.Dequeue();  
  
            m_resetAction?.Invoke(t);  
  
            return t;  
        } else {  
            var t = new T();  
              
            m_onetimeInitAction?.Invoke(t);  
  
            return t;  
        }  
    }  
  
    public void Store(T obj) {  
        m_objectQueue.Enqueue(obj);  
    }  
}
  • 此对象池约束 T 必须为引用类型,且有一个无参构造函数。

  • 有一个 resetonetimeInit 的泛型委托,复制重置对象和第一次初始化对象

  • 采用了延迟策略,只有在调用 New 的时候才会初始化或者重置对象

2 被管理类型自重置的池

对于上面那个对象池,我们将其初始化和重置操作和对象本身分离了,造成了紧耦合,因此可以使用一个 IResetable 接口,使得类型 T 可以由本身初始化或者重置

3 使用 Dictionary 和 List 实现的对象池

此处使用一个 Dictionary<string, List<GameObject>> 的数据结构,实现了对任一预制体对象的对象池,提高通用性;每次只需根据对象名字找到相应存储区域即可。

Last updated