对象池模块是 TEngine 框架中的中量级对象管理工具,在客户端开发中是一个经常使用的技术。对象池通过对象复用机制,减少 GameObject 的创建和销毁开销,提升游戏性能。
-
🔄 对象复用
- 减少 GameObject 的创建和销毁
- 降低内存分配和 GC 压力
- 提升游戏性能
-
🎯 灵活的对象池类型
- 支持单次获取对象池
- 支持允许多次获取对象池
- 可配置对象池容量和过期时间
-
🛡️ 自动生命周期管理
- 对象获取时自动初始化
- 对象释放时自动清理
- 支持对象池自动释放
对象类需要继承 ObjectBase:
/// <summary>
/// Actor 对象。
/// </summary>
public class Actor : ObjectBase
{
private GameObject _target;
/// <summary>
/// 创建 Actor 对象。
/// </summary>
/// <param name="name">对象名称。</param>
/// <param name="target">对象持有实例。</param>
/// <returns>Actor 对象实例。</returns>
public static Actor Create(string name, object target)
{
var actor = MemoryPool.Acquire<Actor>();
actor.Initialize(name, target);
return actor;
}
/// <summary>
/// 释放对象。
/// </summary>
/// <param name="isShutdown">是否是关闭对象池时触发。</param>
protected override void Release(bool isShutdown)
{
_target = null;
}
}public class ActorManager
{
/// <summary>
/// Actor 对象池。
/// </summary>
private IObjectPool<Actor> _actorPool;
void Start()
{
// 创建允许单次获取的对象池
_actorPool = GameModule.ObjectPool.CreateSingleSpawnObjectPool<Actor>(
Utility.Text.Format("Actor Instance Pool ({0})", name)
);
}
}/// <summary>
/// 创建 Actor 对象。
/// </summary>
/// <param name="actorName">对象名称。</param>
/// <param name="target">对象持有实例。</param>
/// <returns>Actor 对象实例。</returns>
public Actor CreateActor(string actorName, GameObject target)
{
Actor ret = null;
if (_actorPool.CanSpawn())
{
// 从对象池中获取
ret = _actorPool.Spawn();
}
else
{
// 创建新对象并注册到对象池
ret = Actor.Create(actorName, target);
_actorPool.Register(ret, true);
}
return ret;
}
/// <summary>
/// 释放 Actor 对象。
/// </summary>
/// <param name="actor">要释放的对象。</param>
public void ReleaseActor(Actor actor)
{
if (actor != null)
{
_actorPool.Unspawn(actor);
}
}/// <summary>
/// 创建允许单次获取的对象池。
/// </summary>
/// <typeparam name="T">对象类型(必须继承 ObjectBase)。</typeparam>
/// <param name="name">对象池名称。</param>
/// <param name="capacity">对象池容量。</param>
/// <param name="expireTime">对象过期时间(秒)。</param>
/// <param name="priority">对象池优先级。</param>
/// <returns>对象池实例。</returns>
IObjectPool<T> CreateSingleSpawnObjectPool<T>(
string name,
int capacity = int.MaxValue,
float expireTime = float.MaxValue,
int priority = 0
) where T : ObjectBase;
/// <summary>
/// 创建允许多次获取的对象池。
/// </summary>
IObjectPool<T> CreateMultiSpawnObjectPool<T>(
string name,
int capacity = int.MaxValue,
float expireTime = float.MaxValue,
int priority = 0
) where T : ObjectBase;/// <summary>
/// 从对象池获取对象。
/// </summary>
T Spawn();
/// <summary>
/// 释放对象回对象池。
/// </summary>
void Unspawn(T obj);
/// <summary>
/// 注册对象到对象池。
/// </summary>
void Register(T obj, bool spawned);
/// <summary>
/// 检查是否可以获取对象。
/// </summary>
bool CanSpawn();- ✅ 频繁创建/销毁的 GameObject(如子弹、特效)
- ✅ UI 列表项(如背包物品、聊天消息)
- ✅ 游戏实体(如敌人、NPC)
// 单次获取对象池:同一时间只能有一个对象被获取
// 适合:唯一对象(如玩家、主摄像机)
var singlePool = GameModule.ObjectPool.CreateSingleSpawnObjectPool<Player>("PlayerPool");
// 多次获取对象池:可以同时获取多个对象
// 适合:可复用的对象(如子弹、特效)
var multiPool = GameModule.ObjectPool.CreateMultiSpawnObjectPool<Bullet>("BulletPool");// ✅ 推荐:在 Release 中清理所有引用
protected override void Release(bool isShutdown)
{
_target = null;
_data = null;
// 清理所有引用,避免内存泄漏
}