ogre 文件系统
资源的状态
资源在ResourceGroupManager中可有如下状态:
a) Undefined:在此状态Resource没有被实例化。此时Resource的路径已经加入资源路径,但只在文件系统中,Ogre对Resource不做任何处理,即OGRE不会加载在此状态的资源。进入此状态的条件:当调用ResourceGroupManager的addResourceLocation方法时;当资源本是有效的实例,但是调用了ResourceManager::remove或ResourceGroupManager::clearResourceGroup后。
b) Declared:此时Resource仍没有被实例化,只是加入资源组的已声明列表。当初生化资源组的时候,在此状态的资源,OGRE将会创建该资源。当调用ResourceGroupManager::declareResource后进入此状态。
c) Unload:此时Resource仍没有配实例化。但查找该资源可以找到,但资源没有使用很多内存,没有被加载。当调用ResourceGroupManager::initialiseResourceGroup或是调用了ResourceManager::create后进入此状态;调用Resource::unload和ResourceGroupManager::unloadResourceGroup后。
d) Loaded:资源完全被加载。调用ResourceGroupManager::loadResourceGroup后进入加载状态。
3)资源的加载顺序:
ResourceGroupManager::addResourceLocation
ResourceGroupManager::initialise
ResourceGroupResourceGroupManager::loadResourceGroup
转自mythma
-----------------------------------------------
1,addlocation后resource进入unknown状态,该资源的物理位置可被group找到
2,initial
a手动declare 资源
b initializeResourceGroup中自动包含declare(解析脚本)
declare之后的资源被加入resourcegroup的列表中 就可以被创建了
1. 解析ResourceGroup里的所有脚本。脚本继承ScriptLoader,是由ResourceManager定义的。这可导致一些资源成为Declared。 2. 创建所有的Declared资源。 3. 相关的ResourceManager创建资源的一个新实例,并把它添加给自己。所有的资源都保存在ResourceManager里。 4. 这个资源同样也被插入到“有序载入列表(ordered loading list)”里。这样使资源按照指定的顺序载入,如果你想要一次性载入整个资源组的话。一个资源的载入顺序在它的ResourceManager中指定。 5. 目前,所有的Declared进入了Created阶段。
create表示有个空的实例被加到manager里了
3,load
所有load的资源的数据都在内存中
===========================================
头疼 好像有不对的地方
在material的parser里有context.material =MaterialManager::getSingleton().create(vecparams[0], context.groupName);
这难道说material在解析的时候就被创建了
根据这两句 parseResourceGroupScripts(grp);
mCurrentGroup = grp;
createDeclaredResources(grp);
确实能说明 先parse再create的
===============
上述问题 我是这样理解的
首先这个是官方教程的资源管理器的文档
1. 解析ResourceGroup里的所有脚本。脚本继承ScriptLoader,是由ResourceManager定义的。这可导致一些资源成为Declared。 2. 创建所有的Declared资源。 3. 相关的ResourceManager创建资源的一个新实例,并把它添加给自己。所有的资源都保存在ResourceManager里。 4. 这个资源同样也被插入到“有序载入列表(ordered loading list)”里。这样使资源按照指定的顺序载入,如果你想要一次性载入整个资源组的话。一个资源的载入顺序在它的ResourceManager中指定。 5. 目前,所有的Declared进入了Created阶段。
这段文字描述的是initialResourceGroup所做的事情 让我以为 解析脚本做了的工作是addresource to declaredResource list
之后 manul 的资源 和解析脚本得到的资源同时做了 2.3.4.。。。
这是代码里对initialResourceGroup的注释<ol>
<li>Scripts for all resource types which support scripting are
parsed from the resource locations, and resources within them are
created (but not loaded yet).</li>
<li>Creates all the resources which have just pre-declared using
declareResource (again, these are not loaded yet)</li>
</ol>
另外 每个parser里并没有 adddeclaredlist这样的操作 而只是如 上述注释所说的create(XXmanager.getsinglton().create)
并且我去掉了 initialRescourseGroup代码里的createDeclaredResources(grp);
其实脚本里的资源都被正常加载使用了parseResourceGroupScripts(grp); mCurrentGroup = grp; // createDeclaredResources(grp); grp->groupStatus = ResourceGroup::INITIALISED;
综上 我的出的结论是 parserscript完成了 资源管理器文档里的 1 2 3 4 5 一直使资源到了 created的阶段
而 对于 和此流程并行的 manual得到的资源 他们走的是created declared resource这个函数。。。和之后的过程
所以并不是create了两次created declared resource遍历的是declaredlist 而parsescript和此list无关