跳到主要内容

模块介绍

重要 注意 提醒

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