CObjectPool.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using System;
  2. using System.Collections.Generic;
  3. namespace Fort23.Core
  4. {
  5. public class ComponentQueue : CObject
  6. {
  7. public string TypeName { get; }
  8. private readonly Queue<CObject> _queue = new Queue<CObject>();
  9. public ComponentQueue(string typeName)
  10. {
  11. this.TypeName = typeName;
  12. }
  13. public void Enqueue(CObject entity)
  14. {
  15. if (!entity.isActive)
  16. {
  17. return;
  18. }
  19. entity.isActive = false;
  20. this._queue.Enqueue(entity);
  21. entity.DormancyObj();
  22. }
  23. public CObject Dequeue()
  24. {
  25. return this._queue.Dequeue();
  26. }
  27. public CObject Peek()
  28. {
  29. return this._queue.Peek();
  30. }
  31. public Queue<CObject> Queue => this._queue;
  32. public int Count => this._queue.Count;
  33. public override void Dispose()
  34. {
  35. while (this._queue.Count > 0)
  36. {
  37. CObject component = this._queue.Dequeue();
  38. component.Dispose();
  39. }
  40. }
  41. public override void ActiveObj()
  42. {
  43. }
  44. public override void DormancyObj()
  45. {
  46. }
  47. }
  48. public class CObjectPool : CObject
  49. {
  50. private static CObjectPool _instance;
  51. public static CObjectPool Instance
  52. {
  53. get
  54. {
  55. if (_instance == null)
  56. {
  57. _instance = new CObjectPool();
  58. }
  59. return _instance;
  60. }
  61. }
  62. private readonly Dictionary<Type, ComponentQueue> _dictionary = new Dictionary<Type, ComponentQueue>();
  63. public CObject Fetch(Type type)
  64. {
  65. CObject obj;
  66. if (!this._dictionary.TryGetValue(type, out ComponentQueue queue))
  67. {
  68. obj = (CObject)Activator.CreateInstance(type);
  69. }
  70. else if (queue.Count == 0)
  71. {
  72. obj = (CObject)Activator.CreateInstance(type);
  73. }
  74. else
  75. {
  76. obj = queue.Dequeue();
  77. }
  78. obj.isActive = true;
  79. obj.ActiveObj();
  80. return obj;
  81. }
  82. public T Fetch<T>() where T : CObject
  83. {
  84. T t = (T)this.Fetch(typeof(T));
  85. return t;
  86. }
  87. public void Recycle(CObject obj)
  88. {
  89. if (obj == null)
  90. {
  91. return;
  92. }
  93. Type type = obj.GetType();
  94. ComponentQueue queue;
  95. if (!this._dictionary.TryGetValue(type, out queue))
  96. {
  97. queue = new ComponentQueue(type.Name);
  98. this._dictionary.Add(type, queue);
  99. }
  100. queue.Enqueue(obj);
  101. }
  102. public void Clear()
  103. {
  104. foreach (KeyValuePair<Type, ComponentQueue> kv in this._dictionary)
  105. {
  106. kv.Value.Dispose();
  107. }
  108. this._dictionary.Clear();
  109. }
  110. public override void Dispose()
  111. {
  112. foreach (KeyValuePair<Type, ComponentQueue> kv in this._dictionary)
  113. {
  114. kv.Value.Dispose();
  115. }
  116. this._dictionary.Clear();
  117. _instance = null;
  118. }
  119. public override void ActiveObj()
  120. {
  121. }
  122. public override void DormancyObj()
  123. {
  124. }
  125. }
  126. }