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:Cocos 和 Horde3D渲染部分的设计比较

其实 渲染引擎,所有的 步骤无非就是:    在 init里 :    创建shader    定义好 要渲染对象的 顶点属性     bind vertex buffer    ...

3D引擎:Horde3D:小感

我们在 使用 Horde3D 写一个  Demo时,      真正的只需要与Horde3D的 以下几个类打交道就行了:     1  SceneManager类,2 ResourceManager类...

Android - Unparsed aapt error(s)错误的处理方法

在Eclipse平台进行Android 应用开发时,编辑,修改或增删 res/下资源文件时有时会遇到如下错误提示:“Unparsed aapt error(s)! Check the consol...

3D引擎:Horde3D:小感3

Horde3D中所有 跟渲染相关的东西 最终都会交给 RenderBase去干。 只要是与 Opengl相关的API在  RenderBase都能找到,绝对是学习opengl的 上好材料 Rend...

3D引擎:Horde3D:读取Shader文件流程(二)

首先,根据[[ ]]来判断 FX, VS_*, FS_*部分 然后,将FX部分给 fxCode字符串, VS_*, FS_*分别交给 CodeResource 并依次存放在 _codeSectio...

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

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

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

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

3D引擎:Horde3D:小感2

我们自己在写Opengl 渲染程序时, 会定义好每个可渲染的物体对象,它的属性可以包含了 顶点,颜色,材质, shader program。 然后,对它定义接口包括更新顶点位置,得到变换矩阵,使用sh...

Urho3D简介

注:这是根据网上一篇文章修改的,修正了一些术语表述,并改成了自己对这个引擎的理解。忘了出处,回头想起来了补上。向原作者致敬。之后有时间会将原文中的内容都替换掉。 Urho3D是一个轻量级、跨平台的...

学习ShaderToy第一天: glsl语言内置函数gl_FragCoord

运行环境:Android opengl es版本: 2.0 3D引擎库 : Rajawali3D ShaderToy上用的shader语言 为glsl , 效果是用webgl跑的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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