【Unity】官方對象池總算實裝了
寫在前面
????最近在Unity2021,發(fā)現(xiàn)了新的命名空間UnityEngine.Pool,這套API最早出現(xiàn)的地方應(yīng)該是UGUI。后面大概是用到這套API的Package太多,干脆變成默認(rèn)的API,可喜可賀。

初階使用
????所有類如下圖所示

????使用很簡單,所有類API風(fēng)格分為兩種:
手動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的設(shè)計初衷,是因為Unity功能包的有些操作需要頻繁使用臨時C#容器類,比如List<T>。如果不使用對象池系統(tǒng),當(dāng)然就是每幀都會造成GC負(fù)擔(dān)。所以最常用的傻瓜式靜態(tài)類都是System.Collections.Generic的池封裝。

高階使用
????核心實現(xiàn)類為ObjectPool<T>,而傻瓜式靜態(tài)容器類(如ListPool<T>)就是聲明一個ObjectPool<T>的靜態(tài)變量,利用泛型變量會根據(jù)T生成,內(nèi)存上不會相互干擾。不過我們直接使用ObjectPool<T>,自定義想要的池對象類型。
public?ObjectPool<T0>(Func<T>?createFunc, Action<T>?actionOnGet, Action<T>?actionOnRelease, Action<T>?actionOnDestroy, bool?collectionCheck, int?defaultCapacity, int?maxSize);
? ? 參數(shù)簡介如下:
createFunc:對象實例化實現(xiàn);
actionOnGet:出池回調(diào);
actionOnRelease:進池回調(diào);
actionOnDestroy:銷毀回調(diào);
collectionCheck:檢查集合,對象進池前,會先檢查是否在池中;
defaultCapacity:默認(rèn)容量;
maxSize:池大小的最大值,超出這數(shù)值,進池的對象直接銷毀;

后記
????其實有了這個API,可以少做很多那些,你為了回避Unity的GC,而做緩存變量等反人類操作。由于實現(xiàn)一個GameObject的對象池,算是爛大街的教程,我也不想多加闡述。畢竟用這個API,代碼可以省一大半了。