//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using System; using System.Collections.Generic; namespace GameFramework { /// /// 引用池。 /// public static partial class ReferencePool { private static readonly Dictionary s_ReferenceCollections = new Dictionary(); private static bool m_EnableStrictCheck = false; /// /// 获取或设置是否开启强制检查。 /// public static bool EnableStrictCheck { get { return m_EnableStrictCheck; } set { m_EnableStrictCheck = value; } } /// /// 获取引用池的数量。 /// public static int Count { get { return s_ReferenceCollections.Count; } } /// /// 获取所有引用池的信息。 /// /// 所有引用池的信息。 public static ReferencePoolInfo[] GetAllReferencePoolInfos() { int index = 0; ReferencePoolInfo[] results = null; lock (s_ReferenceCollections) { results = new ReferencePoolInfo[s_ReferenceCollections.Count]; foreach (KeyValuePair referenceCollection in s_ReferenceCollections) { results[index++] = new ReferencePoolInfo(referenceCollection.Key, referenceCollection.Value.UnusedReferenceCount, referenceCollection.Value.UsingReferenceCount, referenceCollection.Value.AcquireReferenceCount, referenceCollection.Value.ReleaseReferenceCount, referenceCollection.Value.AddReferenceCount, referenceCollection.Value.RemoveReferenceCount); } } return results; } /// /// 清除所有引用池。 /// public static void ClearAll() { lock (s_ReferenceCollections) { foreach (KeyValuePair referenceCollection in s_ReferenceCollections) { referenceCollection.Value.RemoveAll(); } s_ReferenceCollections.Clear(); } } /// /// 从引用池获取引用。 /// /// 引用类型。 /// 引用。 public static T Acquire() where T : class, IReference, new() { return GetReferenceCollection(typeof(T)).Acquire(); } /// /// 从引用池获取引用。 /// /// 引用类型。 /// 引用。 public static IReference Acquire(Type referenceType) { InternalCheckReferenceType(referenceType); return GetReferenceCollection(referenceType).Acquire(); } /// /// 将引用归还引用池。 /// /// 引用。 public static void Release(IReference reference) { if (reference == null) { throw new GameFrameworkException("Reference is invalid."); } Type referenceType = reference.GetType(); InternalCheckReferenceType(referenceType); GetReferenceCollection(referenceType).Release(reference); } /// /// 向引用池中追加指定数量的引用。 /// /// 引用类型。 /// 追加数量。 public static void Add(int count) where T : class, IReference, new() { GetReferenceCollection(typeof(T)).Add(count); } /// /// 向引用池中追加指定数量的引用。 /// /// 引用类型。 /// 追加数量。 public static void Add(Type referenceType, int count) { InternalCheckReferenceType(referenceType); GetReferenceCollection(referenceType).Add(count); } /// /// 从引用池中移除指定数量的引用。 /// /// 引用类型。 /// 移除数量。 public static void Remove(int count) where T : class, IReference { GetReferenceCollection(typeof(T)).Remove(count); } /// /// 从引用池中移除指定数量的引用。 /// /// 引用类型。 /// 移除数量。 public static void Remove(Type referenceType, int count) { InternalCheckReferenceType(referenceType); GetReferenceCollection(referenceType).Remove(count); } /// /// 从引用池中移除所有的引用。 /// /// 引用类型。 public static void RemoveAll() where T : class, IReference { GetReferenceCollection(typeof(T)).RemoveAll(); } /// /// 从引用池中移除所有的引用。 /// /// 引用类型。 public static void RemoveAll(Type referenceType) { InternalCheckReferenceType(referenceType); GetReferenceCollection(referenceType).RemoveAll(); } private static void InternalCheckReferenceType(Type referenceType) { if (!m_EnableStrictCheck) { return; } if (referenceType == null) { throw new GameFrameworkException("Reference type is invalid."); } if (!referenceType.IsClass || referenceType.IsAbstract) { throw new GameFrameworkException("Reference type is not a non-abstract class type."); } if (!typeof(IReference).IsAssignableFrom(referenceType)) { throw new GameFrameworkException(Utility.Text.Format("Reference type '{0}' is invalid.", referenceType.FullName)); } } private static ReferenceCollection GetReferenceCollection(Type referenceType) { if (referenceType == null) { throw new GameFrameworkException("ReferenceType is invalid."); } ReferenceCollection referenceCollection = null; lock (s_ReferenceCollections) { if (!s_ReferenceCollections.TryGetValue(referenceType, out referenceCollection)) { referenceCollection = new ReferenceCollection(referenceType); s_ReferenceCollections.Add(referenceType, referenceCollection); } } return referenceCollection; } } }