模塊介紹
Coding Style wiki
基本說明
簡易 GameObject 物件池,支持異步分散幀加載 (負載平衡),透過掛載 NodePool 組件即可配置物件池來源、初始數量、自動增長 (Auto Put) 與最大數量限制 (Max Size)。
- 版本:v1.0.2 (
com.michaelo.oxgkit.poolsystem) - 命名空間:
OxGKit.PoolSystem
注意 本模組依賴 LoggingSystem 作為日誌輸出 (日誌器名稱為 OxGKit.PoolSystem.Logger),建議先安裝。
應用說明
NodePool 配置介面
- 透過 Add Component -> OxGKit -> PoolSystem -> NodePool 將組件掛載至場景節點上 (該節點即為物件池的容器節點),並於 Inspector 上進行以下配置:
- Source options
- go (Source GameObject):物件池的來源物件 (必填)。
- Pool options
- initializeOnStart:是否於
Start自動初始物件池 (預設開啟)。 - initSize:物件池的初始數量。
- initLoadAcrossFrames:初始時啟用分散幀加載 (負載平衡)。
- initDelayFrameAfterSpawnCount、initDelayFrame:初始時每生成 N 個物件後,延遲 M 幀再繼續生成。
- initializeOnStart:是否於
- Auto put options
- autoPut:池中無可用物件時,是否自動增生。
- autoPutSize:每次自動增生的數量。
- autoPutLoadAcrossFrames、autoDelayFrameAfterSpawnCount、autoPutDelayFrame:自動增生時的分散幀加載配置。
- Limit options
- maxSize:物件池上限,
0或-1為不限制,> 0時 initSize 與 autoPut 增生皆會受限。
- maxSize:物件池上限,
- Source options
重要 Source GameObject 不能為空,未指定來源時初始物件池會擲出 ArgumentNullException;另外一個 NodePool 僅池化一種來源物件,多種物件請分別建立 NodePool 。
分散幀加載 (負載平衡)
啟用 initLoadAcrossFrames / autoPutLoadAcrossFrames 後,實例化流程會以「每生成 N 個物件,延遲 M 幀」的方式 (基於 UniTask) 分散至多幀執行,避免同一幀大量 Instantiate 造成卡頓,可透過 IsLoadFinished() 確認加載是否完成。
自動增長 (Auto Put)
啟用 autoPut 後,Get() 發現池中無可用物件時,會自動增生 autoPutSize 個物件 (增生數量會受 maxSize 限制);即使開啟分散幀加載,第一個物件仍會同幀建立並立即返回。未啟用 autoPut 時,池空的 Get() 會回傳 null。
數量限制 (Max Size)
maxSize 設為 > 0 時會限制物件池的總量 (initSize 與 autoPut 增生皆受限),超出上限的 Put() 會直接銷毀該物件並輸出日誌提醒。
提醒 池中數量統計的是閒置物件 (Get() 取出會遞減、Put() 歸還會遞增),設置 maxSize 時請以尖峰同時使用量進行評估。
簡單使用
取出與歸還
using OxGKit.PoolSystem;
using System.Collections.Generic;
using UnityEngine;
public class NodePoolDemo : MonoBehaviour
{
// 於 Inspector 指定場景上的 NodePool (已配置 Source GameObject)
public NodePool objPool;
// 取出的物件緩存
private Queue<GameObject> _objs = new Queue<GameObject>();
private void Start()
{
// 手動初始物件池 (勾選 initializeOnStart 則會於 Start 自動初始)
this.objPool.Initialize();
}
public void GetFromPool()
{
// 從物件池取出並指定父節點 (池中無可用物件且未開啟 autoPut 時會回傳 null)
var go = this.objPool.Get(this.transform);
if (go != null)
this._objs.Enqueue(go);
}
public void PutIntoPool()
{
// 使用完畢歸還物件池
if (this._objs.Count > 0)
this.objPool.Put(this._objs.Dequeue());
}
}
檢查物件池狀態
// 分散幀加載是否完成
bool isLoadFinished = this.objPool.IsLoadFinished();
// 當前池中的閒置數量
int count = this.objPool.Count();
// 清空物件池 (取消未完成的加載並銷毀池中物件)
this.objPool.Clear();
[參考 Example]
Installation
| Install via git URL |
|---|
| Add https://github.com/michael811125/OxGKit.git?path=Assets/OxGKit/PoolSystem/Scripts to Package Manager |
依賴庫 (需自行安裝)
- 使用 UniTask v2.5.0 or higher, Add https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask to Package Manager
- 使用 LWMyBox v1.1.4 or higher, Add https://github.com/michael811125/LWMyBox.git to Package Manager
- 使用 OxGKit.LoggingSystem, Add https://github.com/michael811125/OxGKit.git?path=Assets/OxGKit/LoggingSystem/Scripts to Package Manager
Samples (Package Manager -> Samples)
- AI Agent Skills (參考 AI Agent Skills)
- NodePool Demo
模塊 API
- Runtime
- NodePool (using OxGKit.PoolSystem)
Demo
PoolSystem Demo