【Unity】官方对象池总算实装了
写在前面
最近在Unity2021,发现了新的命名空间UnityEngine.Pool,这套API最早出现的地方应该是UGUI。后面大概是用到这套API的Package太多,干脆变成默认的API,可喜可贺。

初阶使用
所有类如下图所示

使用很简单,所有类API风格分为两种:
手动Get,手动Release;
var list=ListPool<MyType>.Get();
// Do Something with list.
ListPool<MyType>.Release(list);
使用Get(out)返回System.IDisposable,放在using中自动释放;
using(ListPool<MyType>.Get(out var list)) {
// Do Something with list.
}
这套API的设计初衷,是因为Unity功能包的有些操作需要频繁使用临时C#容器类,比如List<T>。如果不使用对象池系统,当然就是每帧都会造成GC负担。所以最常用的傻瓜式静态类都是System.Collections.Generic的池封装。

高阶使用
核心实现类为ObjectPool<T>,而傻瓜式静态容器类(如ListPool<T>)就是声明一个ObjectPool<T>的静态变量,利用泛型变量会根据T生成,内存上不会相互干扰。不过我们直接使用ObjectPool<T>,自定义想要的池对象类型。
public ObjectPool<T0>(Func<T> createFunc, Action<T> actionOnGet, Action<T> actionOnRelease, Action<T> actionOnDestroy, bool collectionCheck, int defaultCapacity, int maxSize);
参数简介如下:
createFunc:对象实例化实现;
actionOnGet:出池回调;
actionOnRelease:进池回调;
actionOnDestroy:销毁回调;
collectionCheck:检查集合,对象进池前,会先检查是否在池中;
defaultCapacity:默认容量;
maxSize:池大小的最大值,超出这数值,进池的对象直接销毁;

后记
其实有了这个API,可以少做很多那些,你为了回避Unity的GC,而做缓存变量等反人类操作。由于实现一个GameObject的对象池,算是烂大街的教程,我也不想多加阐述。毕竟用这个API,代码可以省一大半了。