ObjectPoolManager.Object.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  6. //------------------------------------------------------------
  7. using System;
  8. namespace GameFramework.ObjectPool
  9. {
  10. internal sealed partial class ObjectPoolManager : GameFrameworkModule, IObjectPoolManager
  11. {
  12. /// <summary>
  13. /// 内部对象。
  14. /// </summary>
  15. /// <typeparam name="T">对象类型。</typeparam>
  16. private sealed class Object<T> : IReference where T : ObjectBase
  17. {
  18. private T m_Object;
  19. private int m_SpawnCount;
  20. /// <summary>
  21. /// 初始化内部对象的新实例。
  22. /// </summary>
  23. public Object()
  24. {
  25. m_Object = null;
  26. m_SpawnCount = 0;
  27. }
  28. /// <summary>
  29. /// 获取对象名称。
  30. /// </summary>
  31. public string Name
  32. {
  33. get
  34. {
  35. return m_Object.Name;
  36. }
  37. }
  38. /// <summary>
  39. /// 获取对象是否被加锁。
  40. /// </summary>
  41. public bool Locked
  42. {
  43. get
  44. {
  45. return m_Object.Locked;
  46. }
  47. internal set
  48. {
  49. m_Object.Locked = value;
  50. }
  51. }
  52. /// <summary>
  53. /// 获取对象的优先级。
  54. /// </summary>
  55. public int Priority
  56. {
  57. get
  58. {
  59. return m_Object.Priority;
  60. }
  61. internal set
  62. {
  63. m_Object.Priority = value;
  64. }
  65. }
  66. /// <summary>
  67. /// 获取自定义释放检查标记。
  68. /// </summary>
  69. public bool CustomCanReleaseFlag
  70. {
  71. get
  72. {
  73. return m_Object.CustomCanReleaseFlag;
  74. }
  75. }
  76. /// <summary>
  77. /// 获取对象上次使用时间。
  78. /// </summary>
  79. public DateTime LastUseTime
  80. {
  81. get
  82. {
  83. return m_Object.LastUseTime;
  84. }
  85. }
  86. /// <summary>
  87. /// 获取对象是否正在使用。
  88. /// </summary>
  89. public bool IsInUse
  90. {
  91. get
  92. {
  93. return m_SpawnCount > 0;
  94. }
  95. }
  96. /// <summary>
  97. /// 获取对象的获取计数。
  98. /// </summary>
  99. public int SpawnCount
  100. {
  101. get
  102. {
  103. return m_SpawnCount;
  104. }
  105. }
  106. /// <summary>
  107. /// 创建内部对象。
  108. /// </summary>
  109. /// <param name="obj">对象。</param>
  110. /// <param name="spawned">对象是否已被获取。</param>
  111. /// <returns>创建的内部对象。</returns>
  112. public static Object<T> Create(T obj, bool spawned)
  113. {
  114. if (obj == null)
  115. {
  116. throw new GameFrameworkException("Object is invalid.");
  117. }
  118. Object<T> internalObject = ReferencePool.Acquire<Object<T>>();
  119. internalObject.m_Object = obj;
  120. internalObject.m_SpawnCount = spawned ? 1 : 0;
  121. if (spawned)
  122. {
  123. obj.OnSpawn();
  124. }
  125. return internalObject;
  126. }
  127. /// <summary>
  128. /// 清理内部对象。
  129. /// </summary>
  130. public void Clear()
  131. {
  132. m_Object = null;
  133. m_SpawnCount = 0;
  134. }
  135. /// <summary>
  136. /// 查看对象。
  137. /// </summary>
  138. /// <returns>对象。</returns>
  139. public T Peek()
  140. {
  141. return m_Object;
  142. }
  143. /// <summary>
  144. /// 获取对象。
  145. /// </summary>
  146. /// <returns>对象。</returns>
  147. public T Spawn()
  148. {
  149. m_SpawnCount++;
  150. m_Object.LastUseTime = DateTime.UtcNow;
  151. m_Object.OnSpawn();
  152. return m_Object;
  153. }
  154. /// <summary>
  155. /// 回收对象。
  156. /// </summary>
  157. public void Unspawn()
  158. {
  159. m_Object.OnUnspawn();
  160. m_Object.LastUseTime = DateTime.UtcNow;
  161. m_SpawnCount--;
  162. if (m_SpawnCount < 0)
  163. {
  164. throw new GameFrameworkException(Utility.Text.Format("Object '{0}' spawn count is less than 0.", Name));
  165. }
  166. }
  167. /// <summary>
  168. /// 释放对象。
  169. /// </summary>
  170. /// <param name="isShutdown">是否是关闭对象池时触发。</param>
  171. public void Release(bool isShutdown)
  172. {
  173. m_Object.Release(isShutdown);
  174. ReferencePool.Release(m_Object);
  175. }
  176. }
  177. }
  178. }