原文地址:http://blog.csdn.net/pizi0475/archive/2010/02/23/5319890.aspx

Resource

Resource的类继承体系如下:

Resource代表着一类可以被载入的资源,比如Mesh,Texture等。每个资源有其唯一的Name,根据Name可以定位到某个资源,这样也确保了资源只能被载入一次。并且Resource必须在一段时间不使用的时候要被删除。
要实现为Resource子类有以下要求:
1.                  构造函数和Resorce有相同的参数。子类构造函数不允许有其它的参数传入,如果需要设置其它成员变量可以通过Set函数。
2.                  实现Resource中的纯虚函数loadImpl和unloadImpl。而且mSize必须在loadImpl调用后设置。
3.                   StringInterface ParamCommand and ParamDictionary setups in order to allow setting of core parameters (prior to load)through a generic interface.
 
资源有两种载入的方法,一个是通过解析脚本文件自动载入,另一种是手工载入。手工载入的好处是:由于某些意外原因导致资源unload,这时就不能通过Resource的reload重新载入,因为是意外原因所以mIsLoaded就仍然为true。通过使用手工载入就可以预防这个问题。
 
 
ResourceManager
ResourceManager的类继承体系如下:

和Resource对比我们可以得出ResourceManager和Resource是一一对应的。其实一个具体类型的ResourceManager就是管理管理这个类型资源的资源池。通过ResourceManager可以可以索引这些资源,查找资源,载入和销毁资源。
ResourceManager还有一些其它功能,比如它保存着它所掌管类型的资源的载入,卸载优先顺序。这样载入资源的时候可以一种一种的载入,节省了时间。ResourceManager自己定义了内存预算,我们载入/卸载的时候都会通知该变这个内存预算值,这样我们就可以得知我们使用了多少内存。另外,要注意的一点是资源可以通过Resource类被载入和卸载,但只能使用ResourceManager来创建和删除。
 
 
ResourceGroupManager
与这个类声明所在的.h文件中有一个ResourceGroupListener类的声明,这个类定义了如下几种事件接口,它们在操作资源的不同时候被调用。
· resourceGroupScriptingStarted
· scriptParseStarted (*)
· scriptParseEnded (*)
· resourceGroupScriptingEnded
· resourceGroupLoadStarted
· resourceLoadStarted (*)
· resourceLoadEnded (*)
· worldGeometryStageStarted (*)
· worldGeometryStageEnded (*)
· resourceGroupLoadEnded
 
ResourceGroupManager把资源分成一个个的组,通过调用资源对应的ResourceManager(注:通过ResourceManagerMap使得string sourceType和ResourceManager挂钩)来加载或卸载组中的资源。此外如果一个ResourceManager支持通过脚本来定义资源,那么这个类就会找到脚本的位置然后告诉ResourceManager来解析它们。在ResourceGroupManager中,资源可以看成有4种状态:Undefined,Declared,Unloaded,Loaded。
ResourceGroupManager可以让你把一系列资源看成是一个单元来载入和卸载。比如一个资源组可以是游戏中一个关卡的所有资源。OGRE中有一个预先定义的资源组: DEFAULT_RESOURCE_GROUP_NAME,它所控制的资源只有到了程序退出时才会被释放。
    一旦你创建了自己的资源组,你可以通过以下3种途径为这个资源组载入资源:
1. 调用declareResource()。
2. 通过使用脚本;ResourceManager的一些子类型拥有特定的脚本类型比如:.material,.overlay等。
3. 调用ResourceManager::create。
如果你使用前面两种方法必须确保调用initialiseResourceGroup。
通过 void createResourceGroup(const String& name)方法我们可以创建一个资源组。
创建好一个资源组后我们就可以为这个资源组增加搜索路径,我们将在这些路径中查找我们需要的资源。通过以下函数我们可以为一个资源组添加搜索路径:
void ResourceGroupManager::addResourceLocation(const String& name,
        const String& locType, const String& resGroup, bool recursive)
设置好资源路径后我们就可以为资源组声明资源,从而你可以载入和卸载它们。声明资源也可以通过解析脚本文件。
        void declareResource(const String& name, const String& resourceType,
            const String& groupName = DEFAULT_RESOURCE_GROUP_NAME,
           const NameValuePairList& loadParameters = NameValuePairList());
 
当我们创建资源组后,添加了搜索路径,并且可能也声明了一些资源后,我们还不能直接使用资源,这个时候我们要调用void initialiseResourceGroup(const String& name)来初始化资源组。这个方法也触发了以下两个行为:
1. 通过给定的资源路径解析资源路径中所有类型资源的脚本,脚本里面的资源将被创建,但这个时候还没有被载入。           
2. 创建通过调用declareResource声明的资源。同样这个时候资源也仅仅是被创建而没有被载入。
所以这个方法只是为各个ResourceManager创建资源而没有载入它们。仅仅是表面应用程序可以找到这些资源,但在调用load之前还不能被使用。还有就是一旦调用这个方法后你就无法再通过脚本,和提前声明来创建新的资源。如果要那么做只有先调用clearResourceGroup,然后重新声明资源,再调用这个函数。
 
资源创建好后为了使用我们必须调用
void loadResourceGroup(const String& name, bool loadMainResources = true,
           bool loadWorldGeom = true);
这样我们才可以使用这些资源。
与它相对的是void unloadResourceGroup(const String& name)调用这个函数后资源将被卸载,但是资源的声明仍然存在于各个ResourceManager中。要取消所有的声明必须调用
void clearResourceGroup(const String& name),当这个函数被调用后所有资源的声明也就不存在了,只剩下资源的搜索路径。
下面这个方法最彻底,它先卸载资源,然后清空资源,最后把资源组从资源组的集合中删除。
void destroyResourceGroup(const String& name)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangwang123654/archive/2009/12/10/4977500.aspx

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pizi0475/archive/2010/02/23/5319890.aspx

转载于:https://www.cnblogs.com/shongbee2/archive/2010/08/31/OGRE_RESOURCE.html

【转】OGRE资源相关分析相关推荐

  1. 基于魔兽哈希算法的Ogre资源文件扩展的设计与实现

    一.功能需求 1.需要实现的功能: (1).创建.打开和关闭资源包. (2).压缩资源包.消除数据添加.修改和删除带来的数据碎片,扩展索引表容量,重设资源包密钥. (3).合并资源包.将外部的资源包整 ...

  2. 使用火炬之光资源(转)

    今天去ogre官网赚了一圈,看到了一款用Ogre做的游戏TorchLight,不妨下下来玩玩. 游戏做的很好,说明ogre的强大. 在安装目录里看到了ogreMain.dll OIS.dll等熟悉的d ...

  3. OGRE 火炬之光(torchlight) 骨骼动画

    源自于:http://hi.baidu.com/zyb_debug/blog/item/56656f02cf6c367d3812bb87.html 今天去ogre官网赚了一圈,看到了一款用Ogre做的 ...

  4. OGRE 火炬之光(torchlight) 骨骼动画 .

    源自于:http://hi.baidu.com/zyb_debug/blog/item/56656f02cf6c367d3812bb87.html 今天去ogre官网赚了一圈,看到了一款用Ogre做的 ...

  5. 【转】使用火炬之光资源(转)

    今天去ogre官网赚了一圈,看到了一款用Ogre做的游戏TorchLight,不妨下下来玩玩. 游戏做的很好,说明ogre的强大. 在安装目录里看到了ogreMain.dll OIS.dll等熟悉的d ...

  6. 基于SpringBoot+SSM实现的Dota2资料库智能管理平台

    基于SpringBoot+SSM实现的Dota2资料库智能管理平台 Dota2资料库智能管理平台的设计与实现 摘    要 当今社会,游戏产业蓬勃发展,如PC端的绝地求生.坦克世界.英雄联盟,再到移动 ...

  7. OGRE的学习资源简单总结

    转:https://www.cnblogs.com/liangliangh/p/3572211.html 首先是wikipedia的介绍: http://en.wikipedia.org/wiki/O ...

  8. (转)修改ETM,用Ogre实现《天龙八部》地形与部分场景详解(附源码)

    本文主要讲的是<天龙八部>游戏的地形和一部分场景的具体实现,使用C++, Ogre1.6,我摸索了段时间,可能方法用的并不是最好的,但好歹实现了.文章可能讲得有点罗嗦,很多简单的东西都讲了 ...

  9. 数字加密c语言程序_大厂程序员整理的 C++ 资源大全,不私藏了,都送给你们吧...

    关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz 发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 1.标准库 C++标准库,包括 ...

最新文章

  1. Exception in thread main java.lang.OutOfMemoryError: Java heap space
  2. 【转】oracle存储过程常用技巧
  3. leetcode 275. H 指数 II
  4. 解决 A component required a bean of ‘XXX.RoleService‘ that could not be found.
  5. web前端开发常用的优化技巧汇总
  6. Delphi / Pascal 语法知识干货
  7. 【优化调度】基于matlab粒子群算法求解燃机冷热电优化联供问题【含Matlab源码 330期】
  8. mac 程序员装机必备 一篇齐全
  9. CodeForces - 1117G
  10. Sqlserver中的日期类型值不能小于1753年
  11. 如何设计报表?手把手教你5步轻松制作报表
  12. 麦克阿瑟天才奖得主解码计算机视觉“原罪”:AI 如何认识人类世界
  13. uniapp实现调起地图导航
  14. 字节跳动面试--二面算法题复盘
  15. DVWA靶场通关(SQL注入)
  16. flutter 顶部状态栏透明
  17. Javaweb 实现简单的用户注册登录(含数据库访问功能)
  18. qt中新增html,Qt和HTML笔记:初始化
  19. Python处理excel-根据全称自动填写简称
  20. 视觉SLAM深度解读

热门文章

  1. java 流 下载文件_java 流实现文件下载问题
  2. 2.2 物理层传输介质
  3. ASIC设计的一些软件
  4. C++实现字符串和整数之间的相互转换
  5. Oracle 12C 利用Rman Duplicate搭建 Data Guard
  6. ELK6.0已取消filebeat配置document_type
  7. 26期Linux20180531 单用户 救援模式 克隆虚拟机 linux机器相互登录
  8. 使用masonry布局旋转View的问题
  9. 第四十四节,subprocess系统命令模块
  10. 为ListView组件加上快速滑块以及修改快速滑块图像