using System; namespace TEngine { internal sealed partial class ObjectPoolModule : Module, IObjectPoolModule { /// /// 内部对象。 /// /// 对象类型。 private sealed class Object : IMemory where T : ObjectBase { private T _object; private int _spawnCount; /// /// 初始化内部对象的新实例。 /// public Object() { _object = null; _spawnCount = 0; } /// /// 获取对象名称。 /// public string Name { get { return _object.Name; } } /// /// 获取对象是否被加锁。 /// public bool Locked { get { return _object.Locked; } internal set { _object.Locked = value; } } /// /// 获取对象的优先级。 /// public int Priority { get { return _object.Priority; } internal set { _object.Priority = value; } } /// /// 获取自定义释放检查标记。 /// public bool CustomCanReleaseFlag { get { return _object.CustomCanReleaseFlag; } } /// /// 获取对象上次使用时间。 /// public DateTime LastUseTime { get { return _object.LastUseTime; } } /// /// 获取对象是否正在使用。 /// public bool IsInUse { get { return _spawnCount > 0; } } /// /// 获取对象的获取计数。 /// public int SpawnCount { get { return _spawnCount; } } /// /// 创建内部对象。 /// /// 对象。 /// 对象是否已被获取。 /// 创建的内部对象。 public static Object Create(T obj, bool spawned) { if (obj == null) { throw new GameFrameworkException("Object is invalid."); } Object internalObject = MemoryPool.Acquire>(); internalObject._object = obj; internalObject._spawnCount = spawned ? 1 : 0; if (spawned) { obj.OnSpawn(); } return internalObject; } /// /// 清理内部对象。 /// public void Clear() { _object = null; _spawnCount = 0; } /// /// 查看对象。 /// /// 对象。 public T Peek() { return _object; } /// /// 获取对象。 /// /// 对象。 public T Spawn() { _spawnCount++; _object.LastUseTime = DateTime.UtcNow; _object.OnSpawn(); return _object; } /// /// 回收对象。 /// public void Unspawn() { _object.OnUnspawn(); _object.LastUseTime = DateTime.UtcNow; _spawnCount--; if (_spawnCount < 0) { throw new GameFrameworkException(Utility.Text.Format("Object '{0}' spawn count is less than 0.", Name)); } } /// /// 释放对象。 /// /// 是否是关闭对象池时触发。 public void Release(bool isShutdown) { _object.Release(isShutdown); MemoryPool.Release(_object); } } } }