跳至主要内容

模塊介紹

重要 注意 提醒

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 幀再繼續生成。
    • Auto put options
      • autoPut:池中無可用物件時,是否自動增生。
      • autoPutSize:每次自動增生的數量。
      • autoPutLoadAcrossFrames、autoDelayFrameAfterSpawnCount、autoPutDelayFrame:自動增生時的分散幀加載配置。
    • Limit options
      • maxSize:物件池上限,0-1 為不限制,> 0initSizeautoPut 增生皆會受限。

重要 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 時會限制物件池的總量 (initSizeautoPut 增生皆受限),超出上限的 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

依賴庫 (需自行安裝)

Samples (Package Manager -> Samples)


模塊 API

  • Runtime

Demo

PoolSystem Demo