GF_ObjectPool
Created|Updated
使用范例
1 2
| m_InstancePool = objectPoolManager.CreateSingleSpawnObjectPool<EntityInstanceObject>(Utility.Text.Format("Entity Instance Pool ({0})", name), instanceCapacity, instanceExpireTime, instancePriority); m_InstancePool.AutoReleaseInterval = instanceAutoReleaseInterval;
|
关于AutoRelease
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| internal override void Update(float elapseSeconds, float realElapseSeconds) { m_AutoReleaseTime += realElapseSeconds; if (m_AutoReleaseTime < m_AutoReleaseInterval) { return; }
Release(); }
public override void Release() { Release(Count - m_Capacity, m_DefaultReleaseObjectFilterCallback); }
|
Release有两个参数:
- 尝试释放的对象数量
- 释放筛选函数
此处Update会每隔一段时间,将超出Capacity数量的对象尝试释放掉
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public void Release(int toReleaseCount, ReleaseObjectFilterCallback<T> releaseObjectFilterCallback) { expireTime = DateTime.UtcNow.AddSeconds(-m_ExpireTime);
GetCanReleaseObjects(m_CachedCanReleaseObjects); List<T> toReleaseObjects = releaseObjectFilterCallback(m_CachedCanReleaseObjects, toReleaseCount, expireTime);
foreach (T toReleaseObject in toReleaseObjects) { ReleaseObject(toReleaseObject); } }
private void GetCanReleaseObjects(List<T> results) { results.Clear(); foreach (KeyValuePair<object, Object<T>> objectInMap in m_ObjectMap) { Object<T> internalObject = objectInMap.Value; if (internalObject.IsInUse || internalObject.Locked || !internalObject.CustomCanReleaseFlag) { continue; } results.Add(internalObject.Peek()); } }
private List<T> DefaultReleaseObjectFilterCallback(List<T> candidateObjects, int toReleaseCount, DateTime expireTime) { }
|
通过默认规则获取候选可释放对象:
- not IsInUse
- not locked
- not CustomCanReleaseFlag
再通过回调函数过滤一遍(releaseObjectFilterCallback)
(不过默认的实现似乎只对其排了一下顺序……
关于CustomCanReleaseFlag
ResourceObject对CustomCanReleaseFlag进行了重写。
即只有当前这个资源没有其他依赖的时候,才允许Release:
1 2 3 4 5 6 7 8 9 10 11 12
| private sealed class ResourceObject : ObjectBase { public override bool CustomCanReleaseFlag { get { int targetReferenceCount = 0; m_ResourceLoader.m_ResourceDependencyCount.TryGetValue(Target, out targetReferenceCount); return base.CustomCanReleaseFlag && targetReferenceCount <= 0; } } }
|
AssetObject类似:
1 2 3 4 5 6 7 8 9 10 11 12
| private sealed class AssetObject : ObjectBase { public override bool CustomCanReleaseFlag { get { int targetReferenceCount = 0; m_ResourceLoader.m_AssetDependencyCount.TryGetValue(Target, out targetReferenceCount); return base.CustomCanReleaseFlag && targetReferenceCount <= 0; } } }
|