Axiom3D:资源引用与加载基本流程.

时间:2023-12-31 23:13:26

Archive:对应文件夹位置,包含文件夹,压缩文件,网络位置,包含Load,Unload,Open,Create,Remove,FineFile等主要虚方法,用于对应各具体Archive来实现.

ResourceLocation:主要包含Archive,Watcher(文件位置变动),Recursive(是否查找子文件夹),Monitor(新建文件是否关联Watcher).

ResourceLocationIndex:为Dictionary<string,Archive>的别名,用于记录对应Archive里的所有文件.

ResourceGroup:成员LocationList为List<ResourceLocation>,而ResourceIndexCaseSensitive与ResourceIndexCaseInsensitive对应ResourceLocationIndex.二者分别记录当前组里所有文件夹和记录当前所有文件夹里的所有文件.

ResourceGroupManager会自动定义四个ResourceGroup,分别是DefaultResourceGroupName,InternalResourceGroupName,BootstrapResourceGroupName,AutoDetectResourceGroupName.用户定义的ResourceGroup可以直接放入配置文件.

Root在第一次初始化窗口时,会对各ResourceManager的子类初始化,如MaterialManager(DefaultResourceGroupName),ParticleSystemManager,MeshManager(InternalResourceGroupName).

资源是共通的,意思资源之间的引用不限制在同一文件夹或是压缩文件内,如在一个文件夹Materials下有一个文件MorningSkyBox.material,里面会有一个资源(Examples/MorningSkyBox)调用cubic_texture morning.jpg separateUV.代码路径大致如下过程:

ResourceGroupManager.Instance.InitializeResourceGroup("groupName");

//遇到MorningSkyBox.material

MaterialManager.ParseScript("MorningSkyBox.material")

//解析文件语句到cubic_texture morning.jpg separateUV

MaterialSerializer.ParseScriptLine("cubic_texture morning.jpg separateUV")

//解析cubic_texture,调用解析cubic_texture的方法

MaterialSerializer.ParseCubicTexture("morning.jpg separateUV")

//生成TextureUnitState

MaterialScriptContext.TextureUnitState.SetCubicTextureName("morning.jpg",false)

//根据文件名加上立方体纹理对应6个位置,得到正确的六个纹理文件名.

注意此时只在TextureUnitState的Frames填充六个纹理文件名,并没有加载资源.

而加载这些资源是在用材质Examples/MorningSkyBox的时候.如下面.

//使用Examples/MorningSkyBox资源做天空图.

SceneManager.SetSkyBox(true,"Examples/MorningSkyBox",5000);

//找到Examples/MorningSkyBox资源然后加载

Resource.Load()

//进入Resource具体的子类Material加载.

Material.Load()

//查找具体的Techniques里的Pass里的TextureUnitState加载.

TextureUnitState.Load()

//我使用的是OpenTK,则最终会使用GLTexture来加载

GLTexture.load()

//把文件名返回给ResourceGroupManager里的OpenResource来处理.

ResourceGroupManager.OpenResource(filename,groupname)

处理在这,我感觉有些问题,在前面TextureUnitState.Load()中,会把所有的资源都统一到组ResourceGroupManager.DefaultResourceGroupName来加载,不知是因为得不到正确的groupName,还是想全放入这个组添加引用.然后在OpenResource会根据DefaultResourceGroupName来查找,会发现找不到,因为这个资源本来是属性用户在配置文件添加的Popule组,这样就会调用ResourceGroupManager._findGroupContainingResoureceImpl(filename)找到正确的组.但是这样会引发一个问题,就是程序内部所有资源名都不能一样,不管是否在同一文件下,不然可能引用不到正确的资源,后面来实验一下.

总的来说,Axiom在解析资源文件时,会得到文件名字,但是不会去加载文件,因为这时并不会保证对应的ResourceManager已经加载过这个文件,只有先加载了所有资源文件,然后在用户使用这些资源时,对应的如材质,图片才会真正的加载.别的资源文件如Mesh,font总的来说也是这个流程.其中各类关系大致如下.

Axiom3D:资源引用与加载基本流程.