3D引擎:Horde3D的 Resource类

原创 2015年11月20日 23:14:59
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的 重要的类

3D引擎:Horde3D:App类

Horde3D引擎 主要位于 Horde3D/Source/Horde3DEngine/Debug/下的 Horde3D.lib。 其源码位于Horde3D/Bindings/C++/Horde3D....

3D引擎:Horde3D:窗口类API:glfw

Horde3D是基于 opengl的 次世代,轻量级渲染引擎。 glfw 这个开源库是一个很好便捷 opengl创建窗口的库, 它创建一个 opengl 上下文的窗口,并可以接收窗口输入事件 关于...

3D引擎:Horde3D:Shader类里的 结构体,以及渲染一个 Logo的简单流程(三)

首先是 ShaderCombination结构体 参数有: 1  uint32          combMask       这个变量主要用来  表示#define的位,每一位表示一个 #de...

3D引擎:Horde3D:如何解析Shader文件(一)

在上一帖中,http://blog.csdn.net/jinghouxiang/article/details/49994983 说了 如何从 Android的jni层获取 Assets文件夹下...

away3D引擎物体鼠标拖动类

  • 2014年08月23日 16:09
  • 14KB
  • 下载

Unity3D 游戏引擎之IOS截屏 话筒录音 录制截屏视频保存沙盒(另类实现方法 )

http://tech.ddvip.com/2013-02/1359995726190109_2.html如下图所示,高级控件的按钮属于UI部分,后面的立方体对象是U3D生成,并且立方体对象在一直的旋...

Unity3D中继承MonoBehaviour的类中会被引擎自动调用的方法

在Unity中有很多方法是会被引擎在特定的时候自动调用的. 在VS里写这些方法的时候看不到它们被调用的次数,其实是引擎通过反射的方法调用的。 很多方法被调用都是有条件的,如OnTriggerEnt...

3D简易引擎

  • 2013年10月24日 15:38
  • 5.4MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3D引擎:Horde3D的 Resource类
举报原因:
原因补充:

(最多只允许输入30个字)