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中,如下:

 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 }

   慢慢进步.......

原文地址:https://www.cnblogs.com/songliquan/p/3298188.html