就Unity游戏开发来说,对象池是一个非常重要的资源管理手段。提供对象缓存池的功能,避免频繁地创建和销毁各种游戏对象,提高游戏性能。除了 Game Framework 自身使用了对象池,用户还可以很方便地创建和管理自己的对象池。
E神
伪代码结构参照https://blog.csdn.net/yupu56/article/details/110206648?spm=1001.2014.3001.5501
伪代码
ObjectPoolManager
ObjectPoolManager 是管理不同对象池的总类 对象池的具体对象管理逻辑会在ObjectPool里面
public class ObjectPoolManager
{
private const int DefaultCapacity = int.MaxValue;//默认容量
private const float DefaultExpireTime = float.MaxValue;//默认释放时间
private const int DefaultPriority = 0;//默认优先级
private readonly Dictionary m_ObjectPools;
private readonly List m_CachedAllObjectPools;
private readonly Comparison m_ObjectPoolComparer;
///
/// 初始化对象池管理器的新实例。
///
public ObjectPoolManager()
{
m_ObjectPools = new Dictionary();
m_CachedAllObjectPools = new List();
m_ObjectPoolComparer = ObjectPoolComparer;
}
public int Priority;/// 获取游戏框架模块优先级。优先级较高的模块会优先轮询,并且关闭操作会后进行
public int Count;/// 获取对象池数量。
///
/// 对象池管理器轮询。
///
/// 逻辑流逝时间,以秒为单位。
/// 真实流逝时间,以秒为单位。
internal override void Update(float elapseSeconds, float realElapseSeconds)
{
foreach (KeyValuePair objectPool in m_ObjectPools)
{
objectPool.Value.Update(elapseSeconds, realElapseSeconds);
}
}
///
/// 获取对象池。
///
/// 对象类型。
/// 要获取的对象池。
public IObjectPool GetObjectPool() where T : ObjectBase
{
return (IObjectPool)InternalGetObjectPool(new TypeNamePair(typeof(T)));
}
///
/// 创建允许单次获取的对象池。
///
/// 对象类型。
/// 要创建的允许单次获取的对象池。
public IObjectPool CreateSingleSpawnObjectPool() where T : ObjectBase
{
return InternalCreateObjectPool(string.Empty, false, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority);
}
///
/// 创建允许多次获取的对象池。
///
/// 对象类型。
/// 要创建的允许多次获取的对象池。
public ObjectPoolBase CreateMultiSpawnObjectPool()
{
return InternalCreateObjectPool(string.Empty, true, DefaultExpireTime, DefaultCapacity, DefaultExpireTime, DefaultPriority);
}
}
ObjectPool
可以看到 ObjectPool 对泛型Object
提供了对象获取,回收与释放方法
提供了对象定时自动释放功能
///
/// 泛型T的对象池。
///
/// 对象类型。
private sealed class ObjectPool : ObjectPoolBase, IObjectPool where T : ObjectBase
{
private readonly GameFrameworkMultiDictionary> m_Objects;
private readonly Dictionary
Object
Object
///
/// 内部对象。
///
/// 对象类型。
private sealed class Object : IReference where T : ObjectBase
{
private T m_Object;
private int m_SpawnCount;
///
/// 创建内部对象。
///
/// 对象。
/// 对象是否已被获取。
/// 创建的内部对象。
public static Object Create(T obj, bool spawned)
{
Object internalObject = ReferencePool.Acquire
小结
GF对象池实现了对象池的基本功能
多个对象池的统一管理
对象的获取回收与释放,对象的复用
对象的自动释放机制


