Unity 框架

ReferencePoolManager.cs 2.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace TFramework
  6. {
  7. public class ReferencePoolManager : BaseManager
  8. {
  9. private Dictionary<Type, ReferencePool> _referencePools = new Dictionary<Type, ReferencePool>();
  10. public int Limit { get; set; } = 100;
  11. /// <summary>
  12. /// 获取引用数量
  13. /// </summary>
  14. /// <param name="type">引用类型</param>
  15. /// <returns>引用数量</returns>
  16. public int GetRerenceCount(Type type)
  17. {
  18. if (_referencePools.ContainsKey(type))
  19. return _referencePools[type].Count;
  20. else
  21. throw new UnityException($"获取引用数量失败,不存在引用池{type.FullName}!");
  22. }
  23. /// <summary>
  24. /// 生成引用
  25. /// </summary>
  26. /// <typeparam name="T"></typeparam>
  27. /// <returns></returns>
  28. public T Spawn<T>() where T : class, IReference, new()
  29. {
  30. Type type = typeof(T);
  31. RegisterRefer(type);
  32. return _referencePools[type].Spawn<T>();
  33. }
  34. /// <summary>
  35. /// 回收引用
  36. /// </summary>
  37. /// <typeparam name="T"></typeparam>
  38. public void Recycle<T>(T refer) where T : class, IReference, new()
  39. {
  40. Type type = refer.GetType();
  41. RegisterRefer(type);
  42. _referencePools[type].Recycle<T>(refer);
  43. }
  44. /// <summary>
  45. /// 批量回收引用
  46. /// </summary>
  47. /// <typeparam name="T">引用类型</typeparam>
  48. /// <param name="refes">引用集合</param>
  49. public void Recycles<T>(List<T> refes) where T : class, IReference, new() => Recycles<T>(refes.ToArray());
  50. /// <summary>
  51. /// 批量回收引用
  52. /// </summary>
  53. /// <typeparam name="T">引用类型</typeparam>
  54. /// <param name="refes">引用数组</param>
  55. public void Recycles<T>(T[] refes) where T : class, IReference, new()
  56. {
  57. if (refes == null) return;
  58. Type type = typeof(T);
  59. RegisterRefer(type);
  60. for (int i = 0; i < refes.Length; i++)
  61. _referencePools[type].Recycle<T>(refes[i]);
  62. }
  63. /// <summary>
  64. /// 清空指定引用池
  65. /// </summary>
  66. /// <param name="type">引用类型</param>
  67. public void Clear(Type type) => _referencePools[type].Clear();
  68. /// <summary>
  69. /// 清空所有引用池
  70. /// </summary>
  71. public void ClearAll()
  72. {
  73. foreach (var refer in _referencePools)
  74. refer.Value.Clear();
  75. }
  76. /// <summary>
  77. /// 注册引用
  78. /// </summary>
  79. /// <param name="type">引用类型</param>
  80. private void RegisterRefer(Type type)
  81. {
  82. if (!_referencePools.ContainsKey(type))
  83. _referencePools.Add(type, new ReferencePool(Limit));
  84. }
  85. }
  86. }