3D引擎:Horde3D的 Resource类

来源:互联网 发布:淘宝网电器城 编辑:程序博客网 时间:2024/05/21 08:48
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的 重要的类
0 0
原创粉丝点击