123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- //------------------------------------------------------------
- // 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
- {
- /// <summary>
- /// 内部对象。
- /// </summary>
- /// <typeparam name="T">对象类型。</typeparam>
- private sealed class Object<T> : IReference where T : ObjectBase
- {
- private T m_Object;
- private int m_SpawnCount;
- /// <summary>
- /// 初始化内部对象的新实例。
- /// </summary>
- public Object()
- {
- m_Object = null;
- m_SpawnCount = 0;
- }
- /// <summary>
- /// 获取对象名称。
- /// </summary>
- public string Name
- {
- get
- {
- return m_Object.Name;
- }
- }
- /// <summary>
- /// 获取对象是否被加锁。
- /// </summary>
- public bool Locked
- {
- get
- {
- return m_Object.Locked;
- }
- internal set
- {
- m_Object.Locked = value;
- }
- }
- /// <summary>
- /// 获取对象的优先级。
- /// </summary>
- public int Priority
- {
- get
- {
- return m_Object.Priority;
- }
- internal set
- {
- m_Object.Priority = value;
- }
- }
- /// <summary>
- /// 获取自定义释放检查标记。
- /// </summary>
- public bool CustomCanReleaseFlag
- {
- get
- {
- return m_Object.CustomCanReleaseFlag;
- }
- }
- /// <summary>
- /// 获取对象上次使用时间。
- /// </summary>
- public DateTime LastUseTime
- {
- get
- {
- return m_Object.LastUseTime;
- }
- }
- /// <summary>
- /// 获取对象是否正在使用。
- /// </summary>
- public bool IsInUse
- {
- get
- {
- return m_SpawnCount > 0;
- }
- }
- /// <summary>
- /// 获取对象的获取计数。
- /// </summary>
- public int SpawnCount
- {
- get
- {
- return m_SpawnCount;
- }
- }
- /// <summary>
- /// 创建内部对象。
- /// </summary>
- /// <param name="obj">对象。</param>
- /// <param name="spawned">对象是否已被获取。</param>
- /// <returns>创建的内部对象。</returns>
- public static Object<T> Create(T obj, bool spawned)
- {
- if (obj == null)
- {
- throw new GameFrameworkException("Object is invalid.");
- }
- Object<T> internalObject = ReferencePool.Acquire<Object<T>>();
- internalObject.m_Object = obj;
- internalObject.m_SpawnCount = spawned ? 1 : 0;
- if (spawned)
- {
- obj.OnSpawn();
- }
- return internalObject;
- }
- /// <summary>
- /// 清理内部对象。
- /// </summary>
- public void Clear()
- {
- m_Object = null;
- m_SpawnCount = 0;
- }
- /// <summary>
- /// 查看对象。
- /// </summary>
- /// <returns>对象。</returns>
- public T Peek()
- {
- return m_Object;
- }
- /// <summary>
- /// 获取对象。
- /// </summary>
- /// <returns>对象。</returns>
- public T Spawn()
- {
- m_SpawnCount++;
- m_Object.LastUseTime = DateTime.UtcNow;
- m_Object.OnSpawn();
- return m_Object;
- }
- /// <summary>
- /// 回收对象。
- /// </summary>
- 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));
- }
- }
- /// <summary>
- /// 释放对象。
- /// </summary>
- /// <param name="isShutdown">是否是关闭对象池时触发。</param>
- public void Release(bool isShutdown)
- {
- m_Object.Release(isShutdown);
- ReferencePool.Release(m_Object);
- }
- }
- }
- }
|