//------------------------------------------------------------
// 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;
}
}
}