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无关
原文地址:https://www.cnblogs.com/minggoddess/p/1983851.html