资源管理
可管理的资源有:
材质资源:在.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 }
慢慢进步.......