一、资源管理数据结构
有效内存管理的关键之一就是如何限制内存分配的总次数,最通用的做法便是把相似的对象放一块,给他们一起分配一块大空间。在需要的时候直接从已分配好的空间中找出一小块直接拿来用,而且空间内存放的都是相同类型的资源,所以某个资源释放后产生的片段刚好可以用于存放另一个同样的资源。这样的一块大空间在GAIA中就被称之为DataPool(数据池)。数据池作为一个存放相同资源的容器,支持动态的添加和释放资源。为了保证数据池能够用于所有类型的资源,所以在实现的时候用了模板。同时,想要做的数据池的通用,统一的接口也是很必要的,以后无论什么资源都以相同的资源进行构造和释放等操作。此时我们就至少该有两个类了,一个叫DataPool,另一个可以是DataPoolInterface接口类。而且DataPool需要继承DataPoolInterface以获取相同的对外接口。
DataPool是如何管理这些资源呢,它的数据结构是什么?
资源何其多啊,如果将资源放在数组中如何呢?放在数组中查询是相当快,但是灵活性变差了,而且事先需要预估数组的长度,在游戏中资源的总数就被限制了。那如果放在链表中呢?这样可以支持动态的增长,但是查找比数组慢多了。GAIA在这里选择了树来存储。用树就意味需要分层次,于是就产生了组的概念。这种组在代码中描述为cPoolGroup(池组),池组中包含了固定数量的资源对象,每个对象存放在某个可用的插槽中。而在DataPool(数据池)中包含了池组的链表,支持动态添加和删除池组,这样既保证了数组的灵活性,也保证了查找的速度。要查找资源的时候先找到资源所在组,再从组中查找具体资源。树的概念就在这里体现出来了。
前面讲到了三个概念:DataPool、PoolGroup、DataPoolInterface。下面我们来看看它们的关系:
下面看看他们的具体实现。
cPoolGroup(池组)
template <class T>
class cPo