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