Ogre引擎源码——资源管理
2012-09-20 21:26
369 查看
http://blog.csdn.net/hunter8777/article/details/6220866
作为一个图形绘制引擎,需要管理非常多的图形资源,比如纹理、三角网格等。今天就来看下Ogre中资源管理部分。
Ogre中资源管理部分大致包含以下头文件:
OgreResource.h
OgreResourceGroupManager.h
OgreResourceManager.h
这部分代码内容不少,但只要能理清这几个类之间的关系,Resource管理的方式也就可见一斑。
先附上一张UML图
中间的三个核心class就是今天的主角。
(1)Resource
该类定义了所有Ogre中可导入资源的统一接口,保存了资源的信息。该类为抽象类。
[cpp]
view plaincopyprint?
/// Creator
ResourceManager* mCreator;
/// Unique name of the resource
String mName;
/// The name of the resource group
String mGroup;
/// Numeric handle for more efficient look up than name
ResourceHandle mHandle;
/// The size of the resource in bytes
size_t mSize;
/// Optional manual loader; if provided, data is loaded from here instead of a file
ManualResourceLoader* mLoader;
AtomicScalar<LoadingState> mLoadingState;
从上述枚举中可以看出,一个资源有两个非常重要的状态:load和prepare。Resource类中的函数基本也就是围绕着这两个状态改变而进行的。
[cpp]
view plaincopyprint?
virtual void preLoadImpl(void) {}
virtual void postLoadImpl(void) {}
virtual void preUnloadImpl(void) {}
virtual void postUnloadImpl(void) {}
virtual void prepareImpl(void) {}
virtual void unprepareImpl(void) {}
virtual void loadImpl(void) = 0;
virtual void unloadImpl(void) = 0;
在ResourceManager中都是以这样的形式出现的。
(2)ResourceManager
Resource类是负责具体资源的load和prepare细节,而ResourceManager类是负责创建、删除和调用Resource的,并管理ResourcePool方便同一资源的多次使用。
该类的主要数据结构定义如下:
[cpp]
view plaincopyprint?
typedef HashMap< String, ResourcePtr > ResourceMap;
typedef HashMap< String, ResourceMap > ResourceWithGroupMap;
typedef map<ResourceHandle, ResourcePtr>::type ResourceHandleMap;
上述是ResourceGroup中的部分代码。
该结构体中定义了一个Group的名字、状态、文件所在的位置,以及导入资源的顺序。关于导入顺序,Ogre代码中给出了一个例子,在导入mesh信息前需要导入骨骼和材质,所以后者的优先级就高于前者。
拥有了这样的Group描述信息,ResourceGroupManager就可以进行管理了。
[cpp]
view plaincopyprint?
/// Map from resource group names to groups
typedef map<String, ResourceGroup*>::type ResourceGroupMap;
ResourceGroupMap mResourceGroupMap;
loader是手动导入资源的类指针;parameters用于StringInterface类设置类成员变量。
该结构定义了一个资源的信息,但注意,Ogre中定义了一个资源并没有真正地将它导入进来,也就是并没有生成资源句柄,只是录入了一些资源信息而已。
这些数据结构定义就是用来保存ResourceDeclaration信息的,ResourceDeclaration同样也保存在ResourceGroup中。
[cpp]
view plaincopyprint?
/// List of resource declarations
typedef list<ResourceDeclaration>::type ResourceDeclarationList;
typedef map<String, ResourceManager*>::type ResourceManagerMap;
/// List of resource declarations
typedef list<ResourceDeclaration>::type ResourceDeclarationList;
typedef map<String, ResourceManager*>::type ResourceManagerMap;
这样我们就能理清Ogre处理一个资源的简单流程了。
1、Ogre启动时对外部资源并不知晓,通过添加资源名称、组名、文件路径等信息,录入资源信息(通常Ogre通过外面脚本定义资源路径);
2、将一个资源归入一个资源组,并通过定义的信息,在内存中实例化相应的资源(具体的创建过程是由ResourceManager调用Resource完成的);
附上一张做得不错的资源状态转换图
作为一个图形绘制引擎,需要管理非常多的图形资源,比如纹理、三角网格等。今天就来看下Ogre中资源管理部分。
Ogre中资源管理部分大致包含以下头文件:
OgreResource.h
OgreResourceGroupManager.h
OgreResourceManager.h
这部分代码内容不少,但只要能理清这几个类之间的关系,Resource管理的方式也就可见一斑。
先附上一张UML图
中间的三个核心class就是今天的主角。
(1)Resource
该类定义了所有Ogre中可导入资源的统一接口,保存了资源的信息。该类为抽象类。
[cpp]
view plaincopyprint?
/// Creator
ResourceManager* mCreator;
/// Unique name of the resource
String mName;
/// The name of the resource group
String mGroup;
/// Numeric handle for more efficient look up than name
ResourceHandle mHandle;
/// The size of the resource in bytes
size_t mSize;
/// Optional manual loader; if provided, data is loaded from here instead of a file
ManualResourceLoader* mLoader;
AtomicScalar<LoadingState> mLoadingState;
[cpp] view plaincopyprint? enum LoadingState { /// Not loaded LOADSTATE_UNLOADED, /// Loading is in progress LOADSTATE_LOADING, /// Fully loaded LOADSTATE_LOADED, /// Currently unloading LOADSTATE_UNLOADING, /// Fully prepared LOADSTATE_PREPARED, /// Preparing is in progress LOADSTATE_PREPARING }; enum LoadingState { /// Not loaded LOADSTATE_UNLOADED, /// Loading is in progress LOADSTATE_LOADING, /// Fully loaded LOADSTATE_LOADED, /// Currently unloading LOADSTATE_UNLOADING, /// Fully prepared LOADSTATE_PREPARED, /// Preparing is in progress LOADSTATE_PREPARING };
从上述枚举中可以看出,一个资源有两个非常重要的状态:load和prepare。Resource类中的函数基本也就是围绕着这两个状态改变而进行的。
[cpp]
view plaincopyprint?
virtual void preLoadImpl(void) {}
virtual void postLoadImpl(void) {}
virtual void preUnloadImpl(void) {}
virtual void postUnloadImpl(void) {}
virtual void prepareImpl(void) {}
virtual void unprepareImpl(void) {}
virtual void loadImpl(void) = 0;
virtual void unloadImpl(void) = 0;
[cpp] view plaincopyprint? typedef SharedPtr<Resource> ResourcePtr; typedef SharedPtr<Resource> ResourcePtr;
在ResourceManager中都是以这样的形式出现的。
(2)ResourceManager
Resource类是负责具体资源的load和prepare细节,而ResourceManager类是负责创建、删除和调用Resource的,并管理ResourcePool方便同一资源的多次使用。
该类的主要数据结构定义如下:
[cpp]
view plaincopyprint?
typedef HashMap< String, ResourcePtr > ResourceMap;
typedef HashMap< String, ResourceMap > ResourceWithGroupMap;
typedef map<ResourceHandle, ResourcePtr>::type ResourceHandleMap;
[cpp] view plaincopyprint? /// Group name String name; /// Group status Status groupStatus; /// List of possible locations to search LocationList locationList; /// Created resources which are ready to be loaded / unloaded // Group by loading order of the type (defined by ResourceManager) typedef map<Real, LoadUnloadResourceList*>::type LoadResourceOrderMap; LoadResourceOrderMap loadResourceOrderMap; /// Group name String name; /// Group status Status groupStatus; /// List of possible locations to search LocationList locationList; /// Created resources which are ready to be loaded / unloaded // Group by loading order of the type (defined by ResourceManager) typedef map<Real, LoadUnloadResourceList*>::type LoadResourceOrderMap; LoadResourceOrderMap loadResourceOrderMap;
上述是ResourceGroup中的部分代码。
该结构体中定义了一个Group的名字、状态、文件所在的位置,以及导入资源的顺序。关于导入顺序,Ogre代码中给出了一个例子,在导入mesh信息前需要导入骨骼和材质,所以后者的优先级就高于前者。
拥有了这样的Group描述信息,ResourceGroupManager就可以进行管理了。
[cpp]
view plaincopyprint?
/// Map from resource group names to groups
typedef map<String, ResourceGroup*>::type ResourceGroupMap;
ResourceGroupMap mResourceGroupMap;
[cpp] view plaincopyprint? String resourceName; String resourceType; ManualResourceLoader* loader; NameValuePairList parameters; String resourceName; String resourceType; ManualResourceLoader* loader; NameValuePairList parameters;
loader是手动导入资源的类指针;parameters用于StringInterface类设置类成员变量。
该结构定义了一个资源的信息,但注意,Ogre中定义了一个资源并没有真正地将它导入进来,也就是并没有生成资源句柄,只是录入了一些资源信息而已。
这些数据结构定义就是用来保存ResourceDeclaration信息的,ResourceDeclaration同样也保存在ResourceGroup中。
[cpp]
view plaincopyprint?
/// List of resource declarations
typedef list<ResourceDeclaration>::type ResourceDeclarationList;
typedef map<String, ResourceManager*>::type ResourceManagerMap;
/// List of resource declarations
typedef list<ResourceDeclaration>::type ResourceDeclarationList;
typedef map<String, ResourceManager*>::type ResourceManagerMap;
这样我们就能理清Ogre处理一个资源的简单流程了。
1、Ogre启动时对外部资源并不知晓,通过添加资源名称、组名、文件路径等信息,录入资源信息(通常Ogre通过外面脚本定义资源路径);
2、将一个资源归入一个资源组,并通过定义的信息,在内存中实例化相应的资源(具体的创建过程是由ResourceManager调用Resource完成的);
附上一张做得不错的资源状态转换图
相关文章推荐
- Ogre引擎源码——Timer
- Ogre引擎源码——资源之GpuProgram
- Ogre引擎源码——文件管理
- 转: 在Ogre中使用Havok物理引擎(源码)
- Ogre引擎源码——资源之Font
- Ogre引擎源码——内存管理
- Ogre引擎源码——资源之Skeleton
- Ogre引擎源码——内存管理
- 在Ogre中使用Havok物理引擎(源码)
- Ogre引擎源码——资源之GpuProgram
- Ogre引擎源码——场景查询
- Ogre引擎源码——UTFString
- Ogre引擎源码——资源之Skeleton
- Ogre引擎源码——内存管理 .
- Ogre引擎源码——Timer
- Ogre引擎源码——String
- 在Ogre中使用Havok物理引擎(源码)
- Ogre引擎源码——资源之Material
- Ogre引擎源码——资源之Skeleton
- Ogre引擎源码——场景查询