Horde3D中 Resource类 和 Scene类时 两大主要的类。 在形式上,这两个类有许多共同点。这里主要讲 Resource类。
Resource主要负责加载我们需要的资源,如 执行的渲染流程, 模型,Texture,Shader code等。Resource类里有一个管理类,专门负责管理需要用到的资源。
主要包括
一个 Resource类:
它是所有Resource文件的基类
对于 Resource的管理,需要智能指针,
智能指针类
在C++中,一般对分配在堆中的 内存需要进行回收。一般,对内存的管理,无外乎
以防 :
1 对象引用的内存块提前被释放掉了,这导致对象在释放时引发崩溃
2 指向内存的指针,在没有释放内存时,指向了别的地方,引发内存泄漏
智能指针就是预防这两种情况的,
它通过 记录对同一内存块的 引用的个数,来预防被引用的内存被提前释放。 同时在指向 其它内存块时,通过赋值构造函数,自动减数。
智能指针是一个模板类,
它里面有 两个私有方法:
一个是 addRef, 当你引用该类时,自动增一
另一个是subRef. 当你析构该类时,自动减一
在构造函数,
复制构造函数里和 赋值构造函数里,会 调用 addRef
在析构函数和 赋值构造函数 里 会 调用 subRef
因此,我们在创建了某个类后,实际一般会使用该类的智能指针
——————————————————————————————
ResourceManager类: ResourceManager类主要 是为了管理 游戏场景中使用的资源类。
ResourceManager的构造函数:
为要管理的资源数量分配了空间,即 一个vector变量, _resources
Horde3D中 Resource类型一共分为以下几种:
SceneGraph
,
Geometry
,
Animation
,
Material
,
Code
,
Shader
,
Texture
,
ParticleEffect
,
Pipeline
对于不同的类型,有其自己的 初始化函数,释放函数 和 构造函数
这些都对应在 _registry的变量里,它是一个 map类型
在Horde3D引擎初始化的过程中, 所有的类型会通过注册函数进行注册
registerResType:
registerResType 是在引擎初始化时,调用的。 由于采用多态技术,因此,需要为每个类型的资源(Resource的子类) 指定它们的 构造函数,这里每个类型的资源都通过其factoryFunc函数来构造。
addResourfce(int type, const string &name, int flags, bool userCall):
这个是我们主动将 需要的资源添加到 我们的application里时调用的函数
type是 我们要添加的资源的类型,
name 是 这个资源的文件路径名
如果这个类型的资源已经存在于 _resources里,那么就对其 引用_userRefCount加一即可,然后返回 这个 资源 在 _resources 的序号(计数从1开始,即在vector中的位置+1)
如果没有,就创建一个该类型的资源,添加到 _resources的 末尾,_userRefCount为1,并调用 addResource(Resource *resource) 函数添加到 _resources
这里的userCall是指 用户自动添加的,那些因为赋值,复制的 都交给智能指针了。
addResource:
这个就是将我们新创建的Resoource 添加到 _resources中, 因为在构造函数中,为其预留了 100个位置的控件,因此,这里在添加时,需要判断是否填满100个,如果填满,直接push_back添加后面就行,如果未填满,就直接数组操作。
removeResource(Resource *resource, bool userCall)
与addResource相对应的就是它了, 这里的remove 也是指用户主动调用,自然是对 _userRefCount -1的操作,其余的也都交给智能指针了。
clear:
它清空 _resources vector数组
queryUnloadedResource(int index):
它是在 从本地文件中加载资源时,需要调用的函数。 从其实现可以看出,它返回的是 _resources 中最前面的资源句柄, 且该资源未被加载过(_loaded)也未被询问过(_noQuery), 在调用时index总为0。
resolveResHandle(ResHandle handle):
它是 根据句柄,在_resources中返回相应的资源。
析构函数:
它首先调用了 clear方法,清理 _resources中所有资源,然后调用 _registry中注册的 资源的 releaseFunc。
__________________________________________________________________
Resource类
构造函数:
主要是为该资源 赋值 类型_type,路径名 _name, 初始化句柄 _handle, 是否加载_loaded, 引用数_refCount, 用户主动添加资源数 _userRefCount , _flags
initDefault:
主要是留给子类的
load :
在父类中,主要是 设置loaded, _noQuery, 即避免同一资源加载两次, 如果 资源data为空,表明该资源未被访问或加载过。
load函数 的具体执行会放在子类中进行,主要是将本地文件的内容,解析为实际的资源类。
——————————————————————————
了解了 Resoure类后,我们就可以 去写 MaterialResource类, 它是我们能够渲染出Logo的 重要的类