# IObjectPool
泛型 接口
- Register (T obj,bool spawned) 创建对象
- CanSpawn () 检查对象 - CanSpawn (string name) 检查对象 - T Spawn () 获取对象 - T Spawn (string name) 获取对象 - void UnSpawn (T obj) 回收对象 - void Unspawn (object target) 回收对象 - SetLocked (T obj,bool locked) 设置对象是否加锁 - SetLocked (object target,bool locked) 设置对象是否被加锁 - void SetPriority (T obj, int priority); 设置优先级 - void SetPriority (object target, int priority); 设置优先级 - bool ReleaseObject (T obj); 释放对象 - bool ReleaseObject (object target); 释放对象 - void Release (); 释放对象池 - void Release (int toReleaseCount); 释放指定数量
# 说下 ObjectPoolManager.Object
这个文件里面主要写了对象池里的对象主要的存取逻辑
往上抽象一层会有 ObjectPoolManager.ObjectPool 内部类如下:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
| private sealed class Object<T> : IReference where T : ObjectBase { private T m_Object; private int m_SpawnCount;
public Object() { m_Object = null; m_SpawnCount = 0; }
public string Name { get { return m_Object.Name; } }
public bool Locked { get { return m_Object.Locked; } internal set { m_Object.Locked = value; } }
public int Priority { get { return m_Object.Priority; } internal set { m_Object.Priority = value; } }
public bool CustomCanReleaseFlag { get { return m_Object.CustomCanReleaseFlag; } }
public DateTime LastUseTime { get { return m_Object.LastUseTime; } }
public bool IsInUse { get { return m_SpawnCount > 0; } }
public int SpawnCount { get { return m_SpawnCount; } }
public static Object<T> Create(T obj, bool spawned) { if (obj == null) { throw new GameFrameworkException("Object is invalid."); }
Object<T> internalObject = ReferencePool.Acquire<Object<T>>(); internalObject.m_Object = obj; internalObject.m_SpawnCount = spawned ? 1 : 0; if (spawned) { obj.OnSpawn(); }
return internalObject; }
public void Clear() { m_Object = null; m_SpawnCount = 0; }
public T Peek() { return m_Object; }
public T Spawn() { m_SpawnCount++; m_Object.LastUseTime = DateTime.UtcNow; m_Object.OnSpawn(); return m_Object; }
public void Unspawn() { m_Object.OnUnspawn(); m_Object.LastUseTime = DateTime.UtcNow; m_SpawnCount--; if (m_SpawnCount < 0) { throw new GameFrameworkException(Utility.Text.Format("Object '{0}' spawn count is less than 0.", Name)); } }
public void Release(bool isShutdown) { m_Object.Release(isShutdown); ReferencePool.Release(m_Object); } }
|
m_Object 是对应的对象实例 SpawnCount 是生成次数 Name: 对象名称
Locked: 当前对象是否上锁 Priority: 当前对象的优先级
CustomCanReleaseFlag: 自定义释放检查的标记
LastUseTime: 对象上次使用的时间
IsInUse: 是否正在使用
函数部分
Create (T obj,bool spawned)
创建内部对象,这个函数在上级的调用里是经过 ObjectPool 进行调用的,具体的实现:先从依赖池里获取一个该泛型类型的依赖对象 (就是该 Object). 然后赋值主要参数 (实际对象和是否已经生成), 之后再调用对象的 OnSpawn 方法
Clear () 清理内部对象 Peek () 查看对象 Spawn () 获取对象
调用这个函数后使用计数器 + 1, 然后更新最后使用时间,同时调用 OnSpawn 方法 (可以理解为类似于初始化) Release () 释放,同时需要处理是否是关闭对象池时触发的。
# 再说下 ObjectPoolManager.ObjectPool
这个子实现是实现管理 Object 的 对象池,通过这个池对对象进行存取,池内维护对象列表
# 最后是 ObjectPoolManager
这个使用来控制对象池的 为什么要分这么细呢,其实主要是因为职责分离开了 本质业务是降低频繁创建对象带来的消耗,所以 Object 类是必要的。因为池子的需求所以需要一个控制 Object 生成与创建的 ObjectPool, 但同时对象池的泛用性又需要得到保证,所以就需要一个可以通过类型获取对象池的管理器,并且通过 Unity 的生命周期对对象池的实现进行维护的 ObjectPoolManager
# 简单的结构图
# 但是其中又用到了 ReferencePool
即依赖池,这个后续需要看一下