ogre3D学习基础8 --- 资源管理器
资源管理
可管理的资源有:
材质资源:在.material文件中包含的材质脚本定义(技术、通路、纹理单元等数据的定义)。
模型资源:经过优化的二进制网格模型文件,扩展名为.mesh。包含几何信息和一些动画数据。
骨骼资源:经过优化的二进制骨骼文件,扩展名为.skeleton。包含骨骼动的数据以及相应帧动画的信息。
字体资源:字体的配置信息,扩展名为.fontdef的文件,其中包括TrueType字体的引用以及其他字体配置数据。
GPU程序资源:在.program中对GPU程序的声明信息,与材质脚本.material文件有类似的结构,但Ogre保证所有.program文件都会在处理材质脚本之前被载入处理。
纹理资源:在纹理中使用的2D图片数据。每种类型都有其自身的扩展名,比如JPG文件的.jpg或者.jpeg,Targa文件的.tga,诸如此类。
资源组
Ogre可以从两个不同的层级来对资源进行管理:对某种类型的资源管理和对一组资源类型的管理。
资源组与世界地图
在默认的情况下,Ogre通过场景管理器把整个地图载入“General”资源组中。因此也可以使用与资源管理一样的方法去管理场景/世界地图资源数据。
资源载入
如果你所使用的资源在之前没有被载入,那么Ogre会自动帮助你在内部执行相应的载入动作。
后台处理资源载入
不得不提出的是,在默认的情况下Ogre并不是线程安全的。
后台载入的实现多线程
在使用多线程管理后台载入的时候,你必须定义一个这样的宏,把它写在OgreConfig.h文件中。这样就可以实现后台载入的功能。
#define OGRE_THREAD_SUPORT 1//
资源卸载
资源数据载入后一直驻留在内存中直到到应用程序强制卸载(通过资源组管理器或者直接释放资源)。Ogre绝不会自动从内存中释放资源,并且你不能够强制卸载还被资源组引用的资源。
资源生存周期
四种状态之间的变化:未定义状态-->已声明状态--->未载入状态--->已载入状态。使用完毕时全部卸载,进入未定义状态。
资源管理的配置文件在resources_d.cfg中,如下:
# Resources required by the sample browser and most samples.
[Essential]
Zip=../../media/packs/SdkTrays.zip
Zip=../../media/packs/profiler.zip
FileSystem=../../media/thumbnails # Common sample resources needed by many of the samples.
# Rarely used resources should be separately loaded by the
# samples which require them.
[Popular]
FileSystem=../../media/fonts
FileSystem=../../media/materials/programs
FileSystem=../../media/materials/scripts
FileSystem=../../media/materials/textures
FileSystem=../../media/materials/textures/nvidia
FileSystem=../../media/models
FileSystem=../../media/particle
FileSystem=../../media/DeferredShadingMedia
FileSystem=../../media/PCZAppMedia
FileSystem=../../media/RTShaderLib
FileSystem=../../media/RTShaderLib/materials
FileSystem=../../media/materials/scripts/SSAO
FileSystem=../../media/materials/textures/SSAO
Zip=../../media/packs/cubemap.zip
Zip=../../media/packs/cubemapsJS.zip
Zip=../../media/packs/dragon.zip
Zip=../../media/packs/fresneldemo.zip
Zip=../../media/packs/ogretestmap.zip
Zip=../../media/packs/ogredance.zip
Zip=../../media/packs/Sinbad.zip
Zip=../../media/packs/skybox.zip [General]
FileSystem=../../media # Materials for visual tests
[Tests]
FileSystem=../../media/../../Tests/Media
文件中有四个资源组,"Essential","Popular","General","Tests",其中的FileSystem代表文件是目录结构的,ZIP代表文件是zip压缩文件。
资源初始化
资源初始化需要一定的顺序支持。在正式添加资源前,你需要首先初始化相应的资源组。
// 初始化所有先前定义的资源组
ResourceGroupManager::getSingleton().initialiseAllResourceGroup();//
// 或者每次交替初始化一个资源组
ResourceGroupManager::getSingleton().intialiseResourceGroup(“Essential”);
ResourceGroupManager::getSingleton().intialiseResourceGroup(“Popular”);
ResourceGroupManager::getSingleton().intialiseResourceGroup(“General”);
ResourceGroupManager::getSingleton().intialiseResourceGroup(“Tests”);
清理或者销毁资源组
清理资源组只是卸载和删除资源组里面的资源。
ResourceGroupManager::getSingleton().clearResourceGroup(“General”);//
销毁资源组不但清理了里面的资源,还销毁了资源本身。
ResourceGroupManager::getSingleton().destroyResourceGroup(“General”);
档案管理器(ArchiveManager)
要实现档案管理的功能,必须定义一个继承自Archive的接口,然后实现相应的工厂方法ArchiveFactory,注册到文档管理器中
class MyArchive : public Archive
{
// 实现代码
} class MyArchiveFactory : public ArchiveFactory
{
//其他ArchiveFactory的一些方法
Archive* createInstance(const String& name)
10 {
return new MyArchive(name, “MyArchiveType”);
12 }
};
void function()
{
MyArchiveFactory *factory = new MyArchiveFactory;
ArchiveManager::getSingleton().addArchiveFactory(factory);
}
慢慢进步.......
ogre3D学习基础8 --- 资源管理器的更多相关文章
- ogre3D学习基础1 -- 核心对象与脚本技术
一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...
- ogre3D学习基础11 -- 交换两个场景管理器
这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头. 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListe ...
- ogre3D学习基础6---场景管理器的使用
场景管理器的使用 最常使用的坐标系统空间(同时也是Ogre程序所能提供的)即是世界空间(World).父节点空间(Parent)以及本地空间(Local). 1.世界空间 就是物体所存在的地方,当我们 ...
- ogre3D学习基础5 -- 阴影与动画
五.阴影 阴影是渲染一个真实场景的重要组成部分,它可以给场景中的物体提供更加真实的感觉,同时还可以帮助用户更好的了解对象间的空间关系. 启用阴影: 缺省情况下,阴影是关闭的,开启方式如下: 1.建立场 ...
- ogre3D学习基础9 -- 光源程序实例
这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光.具体内容前面说过,这里就不解释了. 继续在上一章的程序的基础上实现. 1.创建摄像机(Camera) createCamera()函数是 ...
- ogre3D学习基础19 --- 材质的继承,纹理的滚动与旋转
以上一节为基础,废话不多说. 首先新增一个节点,用于比较显示 //新增一个节点 ent = mSceneMgr->createEntity("Quad"); ent-> ...
- ogre3D学习基础18 -- 材质的使用与脚本的简单书写
这一节以基础16为基础,练习材质的使用. 第一,看看框架 //material #include "ExampleApplication.h" class TutorialAppl ...
- ogre3D学习基础17 --- 如何手动创建ogre程序
建立自己的Ogre程序 一直以来都是使用ExampleApplication.h来写程序,现在来看看它到底有什么神奇的地方. 首先,我们新建一个win32空项目 然后配置环境 最后新建define.c ...
- ogre3D学习基础16 -- 手动创建实体(ManualObject)
这一节练习一下手动创建实体,用到了对象(ManualObject) 第一,依然是模板 #include "ExampleApplication.h" class Example1 ...
随机推荐
- 洛谷 P1137 旅行计划
旅行计划 待证明这样dp的正确性. #include <iostream> #include <cstdio> #include <cstring> #includ ...
- <转>Java 高并发综合
并发模型 悲观锁和乐观锁的理解及如何实现,有哪些实现方式? 悲观锁 悲观锁假设最坏的情况(如果你不锁门,那么捣蛋鬼就会闯入并搞得一团糟),并且只有在确保其他线程不会干扰(通过获取正确的锁)的情况下才能 ...
- 快速搭建基于Azure Paas的高可用WordPress网站
产品详情 产品介绍 WordPress是一种使用非常广泛的CMS系统.本应用是根据Azure Resource Manager模板创建的.通过该ARM模板可以快速建立web应用和MySQL数据库,部署 ...
- ABAP的Package interface, 安卓的manifest.xml和Kubernetes的Capabilities
ABAP 事务码SE21创建ABAP包接口.这是ABAP基于包层面的访问控制实现逻辑.包里可以存储很多ABAP对象.如果开发人员想将某些对象声明为包外程序也能访问,可以将这些对象放在包接口的Visib ...
- 有关mybatis的动态sql
一般地,实现动态SQL都是在xml中使用等标签实现的. 我们在这里使用SQL构造器的方式, 即由abstract sql写出sql的过程, 当然感觉本质上还是一个StringBuilder, 来手动生 ...
- WPF DataGridCheckBoxColumn需要点两次才能修改checkbox状态
如题,如果必须要用DataGridCheckBoxColumn使用一下方式就可以解决需要点击两次才能改状态的问题 <DataGridCheckBoxColumn> <DataGrid ...
- VS code 豆沙绿护眼主题
一.下载亮色主题Atom One Light 二.找到settings.JSON,粘贴JSON 快捷键输入 Ctrl+Shift+p ,输入settings,选择open settings (J ...
- Vue处理ajax请求
Ajax请求 1>解决跨域问题 1.1前端解决.只需要在vue.config.js中增加devServer节点增加代理: const path = require("path" ...
- 01_4_SERVLET声明周期
01_4_SERVLET声明周期 1. Servlet的生命周期 生命全过程 加载ClassLoader 实例化 new //客户端第一次请求的时候,只new一次 初始化init(ServletCon ...
- 安装mysqlclient失败
环境:python3.6 sudo apt-get install python3.6-dev sudo apt-get install default-libmysqlclient-dev 参考:h ...