资源管理器 ResLoader
负责加载资源
资源项: ResItem 负责管理资源的引用计数
ResHelper
为了跨引擎使用ResLoader,我自定义了ResType枚举、ResInterface 接口和这个Creator加载辅助类ResHelper,如果不涉及到跨引擎的话,可以去掉这几个东西,然后直接把AssetBundle传到ResLoader中使用。
将一个模块的资源放入一个目录中,将这个目录设置为Bundle
在ModuleManger中设置bundle的名字
点击进入时或者在loading的时候设置对应模块的Bundle
进入模块之前设置为此模块对应的模块ID,那么此时获得的ResLoader 自然就是battle模块的ResLoader了,并且ResLoader使用的Bundle 是名称为 battle 的Bunlde。
清理资源,这里需要指定模块ID。由于引擎做了资源引用计数的事情,所以我们不用再去管理依赖关系,省了很多事情。
如果是resource中的资源作为bundle之后,需要从resource中拿到外边。
发布小游戏时压缩类型设置为小游戏子包,官方文档已说明
看到论坛对于2.4的引用计数问题讨论的非常激烈。
https://forum.cocos.org/t/2-4-0/95076/32
我做的资源管理器有如下规则
所有资源必须通过资源项ResItem的getRes接口获得,保证使用一次计数增加一次,不参与引擎提供的计数管理。由于引擎自己管理的依赖关系,所以2.4之后不再需要维护资源的依赖关系。只维护好自己的使用次数就好。
ResLoader 提供删除某个资源的功能,应对ui清理需求。如果删除整个模块,调用release 接口即可。
ResLoader 支持直接缓存一个挂载到场景中的资源,比如初始场景会直接挂载一个预制体,避免黑屏。如果不想清理场景只想清理这个预制体就可以这样使用。
实际应用可能复杂的多,每个人的用法不同,不保证没有问题。
结语
以上各种方案仅是我个人的使用方式,并非最佳方案,可能会有bug,仅供大家参考,谁有更好的方式,也分享出来,互相学习。