感觉把所有游戏内容都放到一个AssetBundle里面这种做法最方便
看你发布到哪个平台下了 小游戏你试试?
我说的一个bundle,是除了内置4个bundle外的,不会影响首屏加载速度。还有其他问题吗?
你有什么问题吗 小游戏 你试试只有一个帮豆的
受限于各个平台的限制,比如小游戏不让热更JS,导致无法在逻辑上做文章,最好的方式,是Bundle负责资源模块化,Bundle放一块还是分开来只是看你的资源怎么整理,比如网易那边是这样区分的。在BIgworld那边其实也就是文件夹。
如果是小游戏的话,都放在一起,config.json会比较大,影响启动速度。当然资源量比较小放在一起也是没什么问题的,放在一个bundle就放在 resources 里就好了,resources本身就是一个bundle
游戏量级大了,bundle 的配置文件就很大了。单一配置文件就好几M,你一个小的模块修改,却要用户重新下载好几M,而别人可能只需要下载几K。游戏和游戏的差距就体现在这种你感觉微不足道的地方。
你说的有一定道理,那如果是一个模块对应一个bundle,改如何管理呢?
一个模块一定要和一个 bundle 对应吗?两个模块相互依赖的时候,是否要划分2个 ?还是整个成一个。没什么经验的时候,你就先写成一个,以后你自己慢慢体会什么情况下拆分 bundle 吧
根据项目来,小型游戏一个就一个了。稍微中大型的就会牵涉到下载,加载,卸载的问题。
我们一般都是定义几个common的bundle,优先级为10,放公共的东西。然后定义一大堆模块bundle,优先级为1。
外部再包一层资源管理器,通过路径获取bundle名称,自动进行bundle加载。
好处在于可以以bundle为单位进行预下载,加载,和卸载模块。preloadDir("")去下载整个bundle,release去卸载整个bundle。 这个粒度上的资源管理会非常方便。
另外一点,为什么unity里面大家都是默认分小bundle的,而cocos不是,是因为cocos本身那个bundle不会像unity一样打成一个.asset文件。如果以后要bundle打包,那分细粒度还有个好处就可以打包。小游戏这边,bundle可以选择zip方式打包,我们配置表就是利用这个方式打包压缩的。
多bundle的情况最难的就是加载管理,A包引用B包必须要先加载B包,游戏开发到后期经常需要模块间交叉引用,有没有什么设计模式能很好的处理这种交叉引用又不会对编写代码造成太多麻烦
谢谢你的分享,你们模块的代码也是放在bundle里面吗?还是代码另外集中放
一个可能的解决方案是,开发一个插件
「静态分析」所有bundle,得出一个「bundle依赖树」
我们bundle只放资源,不放代码,代码是单独目录的不打bundle
依赖关系我们比较粗暴,分成2层,下层几个公共bundle,优先级是10,放公共的资源。上层每个模块一个bundle,优先级是1,放模块资源。
这样就是模块bundle依赖公共bundle了。公共bundle游戏开始的时候加载就好,模块bundle就算有依赖重复的,因为优先级一样,所以就复制了依赖资源多份。虽然资源重复,但是运行的时候还是只加载先引用的那份。
如果资源被bundle复制多份,卸载的时候需要改一下底层,判断资源在多个bundle内就不卸载。
这种情况,代码都在main这个bundle里面,可能会影响首次进入画面的时间
资源引用没有采用addRef和decRef吗?为什么还要判断在多个bundle内
我们上层逻辑不对单个资源做ref的,因为可能会漏掉的情况很多,ts不像cpp一样有好的析构方式,引用手工来减少就容易漏掉。
我们是根据bundle整体的一个引用,单模块,单角色,单特效都是一个bundle。当模块界面打开关闭,或者某个角色加载卸载,或者某个特效加载卸载,做一个引用。引用归零并超时后整体卸载bundle。
release这块我们改了2个东西,保证删除正常。第一个就是bundle.releaseAll的时候,不要根据引用删除到bundle外的资源,例如依赖的公共资源。第二个就是bundle.releaseAll的时候,如果发现某个资源被复制过到其他同优先级的bundle内,那就不删除这个资源。
一般我们定bundle的情况都是很独立的,例如每个角色一个bundle,中间是没有依赖的,所以第二种情况相对会比较少。然后如果说把这个复制资源的最后那一个bundle卸载掉,他自然也会被卸载掉。所以这个逻辑是没什么问题的。
可以参考 OpenTGX:https://github.com/MrKylinGithub/OpenTGX/blob/main/docs-cn/developer-guide.md
里面包含了我常用的 Cocos Bundle 用法,加载流程,以及 UI 等模块管理。
感觉这是让项目变得更让人难以理解的做法,无论如何都要加载了B-Bundle才能在A-Bundle中使用,我觉得最好还是不要这么给项目打补丁,老老实实从新整理Bundle才对吧