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
- 3D引擎:Horde3D的 Resource类
- 3D引擎:Horde3D:App类
- 3D引擎:Horde3D:Cocos 和 Horde3D渲染部分的设计比较
- 3D引擎:Horde3D:窗口类API:glfw
- 3D引擎:Horde3D:小感3
- 3D引擎:Horde3D:小感
- 3D引擎:Horde3D:小感2
- 3D引擎:Horde3D:Shader类里的 结构体,以及渲染一个 Logo的简单流程(三)
- Horde3D——基于C++编写的3D渲染引擎
- 3D引擎:Horde3D:如何解析Shader文件(一)
- 3D引擎:Horde3D:读取Shader文件流程(二)
- 我的3D引擎
- 最通用的跨平台引擎:ShiVa 3D引擎
- 【游戏引擎】Autodesk的Stingray 3D 引擎
- 3D引擎的基本内容
- 我的3D引擎效果图
- 我的3D引擎----云效果
- 我的3D引擎----水面渲染
- 06-图1-列出连通集
- mongodb--基本操作
- 【Leetcode】Invert Binary Tree
- UI 第九天 UITableView
- Mac OS X版本历史
- 3D引擎:Horde3D的 Resource类
- 分布式的消息队列系统——Kafka
- 《c语言从入门到精通》看书笔记——第15章 存储管理
- iOS UIScrollView实用之图片轮播 —— HERO博客
- LightOJ 1031-Easy Game
- python学习笔记(4)
- git如何回退到原来之前一个版本
- wmic
- Android API级别