OGRE
资源相关分析
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)
|