使用范例

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有两个参数:

  1. 尝试释放的对象数量
  2. 释放筛选函数

此处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());
}
}

//releaseObjectFilterCallback的默认实现
private List<T> DefaultReleaseObjectFilterCallback(List<T> candidateObjects, int toReleaseCount, DateTime expireTime)
{
//1. 获取距离上次使用(LastUseTime)超过expireTime的对象
//2. 剩下的对象按照优先级和上次使用时间排序
//返回之
}

通过默认规则获取候选可释放对象:

  1. not IsInUse
  2. not locked
  3. 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;
}
}
}