GameFramework.ObjectPoolManager 详解

总图

1.对象

想要使用对象池,存储实例的类型必须继承于ObjectBase。 其中诸多属性决定了该实例在池中的生命周。

其中索引相关的属性为:

Name 对象的名称

Target 对象携带的内容

这两个属性均可以用来在池中索引对应的 ObjectBase 实例。

释放相关的必要属性为:

Locked 锁定状态,锁定状态为 true 不会被释放。

CustomCanReleaseFlag 自定义释放标记,自定义释放标记为 false 不会被释放,可在继承的类中编写逻辑通过控制释放标记来控制释放 ( ResourceManager 模块中就是通过控制这个标记,来管理引用关系的资源对象先后释放顺序)。

以上是释放的必要条件,但是除此之外对象池还维护了一个 “使用计数”,每次获取一个 ObjectBase 实例,则它的使用计数 +1,反之使用计数 -1,如果使用计数不为0 也是不能释放的,因此只有满足以上三个条件才能被标记为可释放对象。

释放排序属性为:

Priority 释放优先级,满足释放条件但是没有过期的情况下,优先级较低的ObjectBase实例将会优先释放

LastUseTime 最后使用时间,满足释放条件但是没有过期的情况下,最后使用时间较早的ObjectBase实例将会优先释放

满足了释放条件的 ObjectBase 实例,并不会立即被释放,而是根据对象池的容量大小来决定是否触发释放,如果对象池的对象实例数量超过了容量大小则会触发一次释放行为,此时首先会找到所有满足释放必要条件的对象,然后依次检查这些满足条件对象的最后使用时间( LastUseTime ),如果已经超过了对象池设定的 “过期时长” 则立即释放。 如果没有过期则优先释放最后使用时间较早和权限较低的对象。

2.对象池

对象池管理对象,是一个链表字典的方式,字典以对象名称(Name)为键,同一个键可以对应到多个对象实例,所以可以将多个相同名称的ObjectBase 实例注册到池子中。

索引相关属性为:

Name 池名称

ObjectType 对象类型

FullName 全名包含了对象类型和池名称,池管理器通过这个名称唯一确定一个实例,如果创建时不输入池名称则名称为null

释放相关的属性如下:

Capacity 容量,对象数量超过容量将会在获取归还以及更新中自动发起释放行为

ExpireTime 过期时长,对象实例满足释放条件后,如果最后使用时间已经超过过期时长,将立即释放

AutoReleaseInterval 自动释放间隔时长,将会每隔一段时间自动调用释放方法,将对象数量控制在容量设定值之内

其他属性:

AllowMultiSpawn 是否允许对象实例被多次获取,如果不允许,则对象实例只能被获取一次,也就是使用计数最多为1,如果池中同名的所有对象实例都再使用中,则直接返回null

猜你喜欢

转载自blog.csdn.net/u012149999/article/details/108766301