项目框架——资源加载【ResObjectManager】

        万物都有度,都有规则,这个资源加载的框架也不是万能的,只不过是罗列了大部分内容而已,所以使用的时候需要按照项目需求去摘取或者使用。

        废话不多说,首先我们来讲一下资源加载框架当中都包含哪些内容。

        第一:资源类型;

        第二:资源信息;

        第三:资源加载回调;

        第四:资源打包。

        总共来讲,就是这四个部分,下面我们按照顺序逐个进行讲解。

        第一部分,资源类型,这个很好理解吧,其实就是你需要加载的内容属于那个类型的资源的一个标识枚举,其中包含了被依赖包【AssetBundle】这个内容标明的是被别人依赖的内容,一般来说外部是不会使用到的;场景预制内容【GameObject】这个是场景内的其他3D2D预制;材质球【Material】;3D图片资源【Texture】;ui预制体【UIPrefab】;2D图片资源【Icon】;音效内容【Aduio】;特效【Effect】;影片【Move】;配置文件【Configuration】;脚本文件【Lua】。当中有很多内容其实都没有用的,只是预制进去,预防后面进行框架扩展的时候使用的。

        具体哪些是目前框架当中使用到了的呢,看下面代码我们就知道了。

        这个图片当中,清楚的知道了我们使用了哪些内容,但是有些内容我们依然不是这样使用的,比如配置文件【Configuration】和脚本文件【Lua】,我们在配置文件框架和lua框架当中都会避开使用资源加载框架,为的是第一时间加载配置文件和lua脚本文件,达到及时读取的效果,剩下的还有未使用到的比如影片【Move】和音效【Audio】这两个部分,也没有使用和经过测试的,因为框架还不完善嘛。

        上面的也就是我们资源的预定义类型,既然叫预定义,是因为后续框架想做成可扩展性,使得框架内容的适应性更加强大。

        下面我们来讲一下资源加载回调,还记得之前我们讲过的消息分发系统,里面有一个消息回调,这个资源回调和那个消息回调是如出一辙,可以说相似度非常的高,唯一不同的是回调参数少了,接下来我们详细的讲一下。

        首先由虚基类IResObjectCallBack开头,这个是资源加载回调的虚基类,所有的加载回调都应该由他派生出来,否则资源加载系统将识别不了这个内容。其中虚基类当中定义了两个函数,一个是HandleLoadCallBack,进行回调方法的;LoadCallBackPriority,进行同资源排序的。当然,框架内部还集成了一个资源加载的预定基类【ResObjectCallBackBase】,他就多了两个内容,一个是加载类型成员属性和一个加载结束回调函数成员属性而且实现了虚基类里面的两个接口,内容相当的简单,可以查看IResObjectCallBack.cs文件就一目了然了。

        资源信息,为什么明明是第二点内容,非要放到第三点当中讲呢,其实这个内容是可以不讲的,因为他属于框架内部数据,并不开放出来的一个内容,但是为了更好的理解资源加载框架,我们这里还是稍微的讲解一下。

        资源信息,其实就是AB包的内容,框架目前其实没有怎么使用到里面的一些数据,只是在等待加载和加载完成之后,封装保存到框架字典当中的一些数据集合,比如说我们等待加载队列当中,就是使用了资源信息,其中包含的是资源名字,资源类型以及回调列表三个内容,当我们加载完成之后,字典保存的又是另外一个AB信息,他包含了是否常驻内存、AB名字、AB、上一次使用时间、被使用次数这五个内容,但是目前框架当中我们只使用了AB名字和AB,其他的内容暂时都还没有使用到,不过基本使用的规则是可以知道的,是否常驻内存,是用来进行资源清理的,AB上一次使用时间和关联次数,这个说白了也是用来控制资源使用量的,目前框架没有涉及,但是思路就是,如果不是常驻内存的AB信息,那么在场景下来的时候,上一次使用时间和被使用次数都太长以及没有被使用,那么切换场景的时候就有可能被清除掉这个内容。

        最后我们来讲一下资源打包,本来想说把这部分内容单独提取出来进行讲解的,后来想想,没有这个必要,因为这个只是一个配套使用的工具内容。

        首先,项目当中需要一个目录【UseAB】,这个目录是固定的,等到后续打包完成之后,可以将这个目录删除掉进行测试,当然,项目研发当中其实不需要删除,接下来,我们先看一下这个打包工具的界面内容。

        简单的一个unity窗口,都是中文内容,其实很好理解,前面的我们都不讲,主要开始位置是打包粒度开始,打包粒度这个目前框架当中预定就是1,意思就是说如果某个资源被多个预制引用,那么这个资源将使用文件名字进行打包,否则使用的都是资源名字进行打包,这个很好理解吧,其实就是控制AB包名字的一个粒度内容;接下来是版本号,这个版本号就是用来做增量比较的,其中项目外还包含了一个资源比对项目,是一个win32的程序,具体的在其他工具框架当中会详细讲解,这里就不多做冗述了。清理依赖关系,分析依赖关系都很好理解,就是清除之前的AB名字,然后重新使用新的依赖关系名字作为AB包名字,最后是打包。

        当我们AB包打包完成之后,窗口会有一定的变化。

        其实就是多了几个步骤,因为我们打包的时候是带着版本号的【其实现在修改了,文件当中不带版本号,因为版本号内容会打入文件AB包中,影响后面的正常加载,所以去除掉,后面修改成打包完成之后重置文件名字的方式进行,目前还未修改。】,所以需要去除版本号,然后分析hash数据,用作版本对比的,最后是Editor测试,说白了就是将文件放到指定的目录当中去,当开启了Build测试的时候就可以了,其中Build测试的意思就是说类似于打包测试,前面我们讲到的宏定义当中有讲述这个内容。

        整体上来讲,整个资源加载的框架就是这样的。

        首先打包机制已经蛮完善了,可以直接使用,配套使用资源加载机制,基本上普通的项目都适用。

        当然,很多小伙伴会问,你的资源加载是不是同步加载的,加载顺序是怎么样的,这个怎么没有讲。那么好的,我们现在来讲一讲。

        首先,这个加载的机制不是同步加载的,使用的是WWW异步加载,加载的顺序是这样的,假如有一个资源需要加载,那么我们先看看这个资源有没有依赖别的AB包,如果有,那么我们需要先加载别的依赖包之后才加载这个内容,如果没有,那么就会直接WWW加载这个内容,我们用一个图进行描述一下。

        这个图当中,很清楚的看出我们整个加载的顺序,其中最重要的加载部分,我们是放再协程当中去做的,避免使用线程加锁的内容,协程也不是一直运行,当加载队列空了的时候,我们就会停止该协程,也就是说我们压入加载队列的时候都会去判断一下队列之前是不是空的,如果是,那么启动协程进行加载,否则就不管。

        最后我们讲一下这个框架使用的一些细节。

        使用这个框架之前,必须使用的方法是InitResManager这个方法,这个方法是使用同步方法加载所有AB的依赖关系的一个内容,如果这个没有做,那么后面的加载在使用AB的情况下都无法使用,除此之外,别的没有特别的要求。

 

项目GitHub地址

https://github.com/FengFaming/ClientEngine

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章