using System;
using System.Collections.Generic;
using AlicizaX;
namespace AlicizaX.ObjectPool
{
internal sealed partial class ObjectPoolService : IObjectPoolService
{
///
/// 内部对象。
///
/// 对象类型。
private sealed class Object : IMemory where T : ObjectBase
{
private string m_Name;
private T m_Object;
private int m_SpawnCount;
private LinkedListNode> m_NameNode;
///
/// 初始化内部对象的新实例。
///
public Object()
{
m_Name = null;
m_Object = null;
m_SpawnCount = 0;
m_NameNode = null;
}
///
/// 获取对象名称。
///
public string Name
{
get { return m_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 LinkedListNode> NameNode
{
get { return m_NameNode; }
internal set { m_NameNode = value; }
}
///
/// 创建内部对象。
///
/// 对象。
/// 对象是否已被获取。
/// 创建的内部对象。
public static Object Create(T obj, bool spawned)
{
if (obj == null)
{
throw new GameFrameworkException("Object is invalid.");
}
Object internalObject = MemoryPool.Acquire>();
internalObject.m_Name = obj.Name;
internalObject.m_Object = obj;
internalObject.m_SpawnCount = spawned ? 1 : 0;
if (spawned)
{
obj.OnSpawn();
}
return internalObject;
}
///
/// 清理内部对象。
///
public void Clear()
{
m_Name = null;
m_Object = null;
m_SpawnCount = 0;
m_NameNode = null;
}
///
/// 查看对象。
///
/// 对象。
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);
MemoryPool.Release(m_Object);
}
}
}
}