资源管理
可管理的资源有:
材质资源:在.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中,如下:
1 # Resources required by the sample browser and most samples.
2 [Essential]
3 Zip=../../media/packs/SdkTrays.zip
4 Zip=../../media/packs/profiler.zip
5 FileSystem=../../media/thumbnails
6
7 # Common sample resources needed by many of the samples.
8 # Rarely used resources should be separately loaded by the
9 # samples which require them.
10 [Popular]
11 FileSystem=../../media/fonts
12 FileSystem=../../media/materials/programs
13 FileSystem=../../media/materials/scripts
14 FileSystem=../../media/materials/textures
15 FileSystem=../../media/materials/textures/nvidia
16 FileSystem=../../media/models
17 FileSystem=../../media/particle
18 FileSystem=../../media/DeferredShadingMedia
19 FileSystem=../../media/PCZAppMedia
20 FileSystem=../../media/RTShaderLib
21 FileSystem=../../media/RTShaderLib/materials
22 FileSystem=../../media/materials/scripts/SSAO
23 FileSystem=../../media/materials/textures/SSAO
24 Zip=../../media/packs/cubemap.zip
25 Zip=../../media/packs/cubemapsJS.zip
26 Zip=../../media/packs/dragon.zip
27 Zip=../../media/packs/fresneldemo.zip
28 Zip=../../media/packs/ogretestmap.zip
29 Zip=../../media/packs/ogredance.zip
30 Zip=../../media/packs/Sinbad.zip
31 Zip=../../media/packs/skybox.zip
32
33 [General]
34 FileSystem=../../media
35
36 # Materials for visual tests
37 [Tests]
38 FileSystem=../../media/../../Tests/Media
文件中有四个资源组,"Essential","Popular","General","Tests",其中的FileSystem代表文件是目录结构的,ZIP代表文件是zip压缩文件。
资源初始化
资源初始化需要一定的顺序支持。在正式添加资源前,你需要首先初始化相应的资源组。
1 // 初始化所有先前定义的资源组
2 ResourceGroupManager::getSingleton().initialiseAllResourceGroup();//
// 或者每次交替初始化一个资源组
ResourceGroupManager::getSingleton().intialiseResourceGroup(“Essential”);
ResourceGroupManager::getSingleton().intialiseResourceGroup(“Popular”);
ResourceGroupManager::getSingleton().intialiseResourceGroup(“General”);
ResourceGroupManager::getSingleton().intialiseResourceGroup(“Tests”);
清理或者销毁资源组
清理资源组只是卸载和删除资源组里面的资源。
1 ResourceGroupManager::getSingleton().clearResourceGroup(“General”);//
销毁资源组不但清理了里面的资源,还销毁了资源本身。
1 ResourceGroupManager::getSingleton().destroyResourceGroup(“General”);
档案管理器(ArchiveManager)
要实现档案管理的功能,必须定义一个继承自Archive的接口,然后实现相应的工厂方法ArchiveFactory,注册到文档管理器中
1 class MyArchive : public Archive
2 {
3 // 实现代码
4 }
5
6 class MyArchiveFactory : public ArchiveFactory
7 {
8 //其他ArchiveFactory的一些方法
9 Archive* createInstance(const String& name)
10 {
11 return new MyArchive(name, “MyArchiveType”);
12 }
13 };
14 void function()
15 {
16 MyArchiveFactory *factory = new MyArchiveFactory;
17 ArchiveManager::getSingleton().addArchiveFactory(factory);
18 }
慢慢进步.......