YanCheng_Metrology/Assets/Framework/Scripts/Runtime/Engine/Engine.Reference/ReferencePool.cs

115 lines
2.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
namespace MotionFramework.Reference
{
/// <summary>
/// 引用池
/// </summary>
public static class ReferencePool
{
private static readonly Dictionary<Type, ReferenceCollector> _collectors = new Dictionary<Type, ReferenceCollector>();
/// <summary>
/// 对象池初始容量
/// </summary>
public static int InitCapacity { get; set; } = 100;
/// <summary>
/// 对象池的数量
/// </summary>
public static int Count
{
get
{
return _collectors.Count;
}
}
/// <summary>
/// 清除所有对象池
/// </summary>
public static void ClearAll()
{
_collectors.Clear();
}
/// <summary>
/// 申请引用对象
/// </summary>
public static IReference Spawn(Type type)
{
if (_collectors.ContainsKey(type) == false)
{
_collectors.Add(type, new ReferenceCollector(type, InitCapacity));
}
return _collectors[type].Spawn();
}
/// <summary>
/// 申请引用对象
/// </summary>
public static T Spawn<T>() where T : class, IReference, new()
{
Type type = typeof(T);
return Spawn(type) as T;
}
/// <summary>
/// 回收引用对象
/// </summary>
public static void Release(IReference item)
{
Type type = item.GetType();
if (_collectors.ContainsKey(type) == false)
{
_collectors.Add(type, new ReferenceCollector(type, InitCapacity));
}
_collectors[type].Release(item);
}
/// <summary>
/// 批量回收列表集合
/// </summary>
public static void Release<T>(List<T> items) where T : class, IReference, new()
{
Type type = typeof(T);
if (_collectors.ContainsKey(type) == false)
{
_collectors.Add(type, new ReferenceCollector(type, InitCapacity));
}
for (int i = 0; i < items.Count; i++)
{
_collectors[type].Release(items[i]);
}
}
/// <summary>
/// 批量回收数组集合
/// </summary>
public static void Release<T>(T[] items) where T : class, IReference, new()
{
Type type = typeof(T);
if (_collectors.ContainsKey(type) == false)
{
_collectors.Add(type, new ReferenceCollector(type, InitCapacity));
}
for (int i = 0; i < items.Length; i++)
{
_collectors[type].Release(items[i]);
}
}
#region
internal static Dictionary<Type, ReferenceCollector> GetAllCollectors
{
get { return _collectors; }
}
#endregion
}
}