using System; using System.Collections.Generic; namespace AlicizaX.Runtime { public static partial class ReferencePool { /// /// 引用集合 /// private sealed class ReferenceCollection { private readonly Queue _references; private readonly Type _referenceType; private int _usingReferenceCount; private int _acquireReferenceCount; private int _releaseReferenceCount; private int _addReferenceCount; private int _removeReferenceCount; public ReferenceCollection(Type referenceType) { _references = new Queue(); _referenceType = referenceType; _usingReferenceCount = 0; _acquireReferenceCount = 0; _releaseReferenceCount = 0; _addReferenceCount = 0; _removeReferenceCount = 0; } /// /// 引用类型 /// public Type ReferenceType { get { return _referenceType; } } /// /// 未使用的引用计数。 /// public int UnusedReferenceCount { get { return _references.Count; } } /// /// 正在使用的引用计数。 /// public int UsingReferenceCount { get { return _usingReferenceCount; } } /// /// 获取引用的次数。 /// public int AcquireReferenceCount { get { return _acquireReferenceCount; } } /// /// 归还引用的次数。 /// public int ReleaseReferenceCount { get { return _releaseReferenceCount; } } /// /// 添加引用的次数。 /// public int AddReferenceCount { get { return _addReferenceCount; } } /// /// 移除引用的次数。 /// public int RemoveReferenceCount { get { return _removeReferenceCount; } } /// /// 从引用池获取引用。 /// /// 引用类型。 /// 引用。 public T Acquire() where T : class, IReference, new() { if (typeof(T) != _referenceType) { throw new GameFrameworkException("Type is invalid."); } _usingReferenceCount++; _acquireReferenceCount++; lock (_references) { if (_references.Count > 0) { return (T)_references.Dequeue(); } } _addReferenceCount++; return new T(); } /// /// 从引用池获取引用。 /// /// 引用。 public IReference Acquire() { _usingReferenceCount++; _acquireReferenceCount++; lock (_references) { if (_references.Count > 0) { return _references.Dequeue(); } } _addReferenceCount++; return (IReference)Activator.CreateInstance(_referenceType); } /// /// 释放一个引用对象。 /// /// 要释放的引用对象。 public void Release(IReference reference) { reference.Clear(); lock (_references) { if (m_EnableStrictCheck && _references.Contains(reference)) { Log.Error("Reference has been released!=>{0}", reference.GetType().FullName); return; } _references.Enqueue(reference); } _releaseReferenceCount++; _usingReferenceCount--; } /// /// 添加指定类型的引用对象到引用池中。 /// /// 要添加的引用对象类型。 /// 要添加的引用对象数量。 /// 类型无效。 public void Add(int count) where T : class, IReference, new() { if (typeof(T) != _referenceType) { throw new GameFrameworkException("Type is invalid."); } lock (_references) { _addReferenceCount += count; while (count-- > 0) { _references.Enqueue(new T()); } } } /// /// 向引用池中添加指定数量的引用。 /// /// 要添加的引用数量。 public void Add(int count) { lock (_references) { _addReferenceCount += count; while (count-- > 0) { _references.Enqueue((IReference)Activator.CreateInstance(_referenceType)); } } } /// /// 从引用池中移除指定数量的引用。 /// /// 要移除的引用数量。 public void Remove(int count) { lock (_references) { if (count > _references.Count) { count = _references.Count; } _removeReferenceCount += count; while (count-- > 0) { _references.Dequeue(); } } } /// /// 从引用池中移除所有的引用。 /// public void RemoveAll() { lock (_references) { _removeReferenceCount += _references.Count; _references.Clear(); } } } } }