简介
bundle包主要用于游戏资源的模块化功能,以便更好的管理游戏资源、优化游戏资源的加载、优化游戏包体的大小,提高游戏体验。我们可以根据实际的场景,把游戏资源进行合理的分包。
bundle类型
cocos包分为内置bundle和自定义bundle。
内置bundle 是cocos默认分配的bundle,一般有 internal、resouces、main、startScene。
自定义bundle 是开发者把一个目录设置为bundle。
内置bundle
- internal bundle:该bundle 开发者一般不会修改到,其是cocos默认存在的,主要存放cocos的内置资源 effects 和Materials。优先级默认:11
- resouces bundle:我们可以理解为是一个存放公共资源bundle。
- 创建:在cocos的资源管理器中,默认是没有resouces 目录的,当我们创建了一个resouces时,则该目录会被cocos识别为一个内置resouces bundle。
- 打包情况:在resouces bundle下的所有资源都会被打包到 resouces bundle下。
- 应用:一般我们会把公共资源存放到该目录下,例如一个资源被多个bundle包使用时,我们应包该资源存放到resouces 目录下。
- 优先级:默认是 8
- main bundle:这是游戏的主包,其范围是所有在asssets目录下且不在任何bundle目录的资源。不需要创建,打包时会自动生成的一个bundle。
- 创建: 不需要创建,打包时cocos会自动生成的一个bundle
- 打包情况:只会打包场景静态引用到的游戏资源,未静态引用到的资源不会打包
- 应用:一般我们把主场景的游戏资源、不是公共的资源存放到该目录下。
- 优先级:默认是 7
注意:
1,不在任何bundle中的场景,都会打包到main包中,且场景静态引用到的资源,都会打包到main包中(忽略优先级),优先级问题后面会具体分析。
2,main包与其他bundle的区别:main包只会打包静态引用到的资源,其他bundle会把bundle目录下的所有资源都会打包进去。(忽略优先级)
自定义的bundle
开发者定义的bundle包 ,即为自定义的bundle。在bundle包中的所有资源都会被打包。
这里对main包与其他bundle区别做个总结:main 只会打包场景依赖的资源。其他bundle会打包目录下与依赖的资源。依赖资源指的是场景与预制体静态引用到的资源。
bundle 的优先级
为了解决单个资源被多个bundle 使用,而不造成资源冗余问题,即出现了bundle 的优先级配置技术。bundle 的默认优先级共有 1-10个优先级。资源打包时,会被优先打包到优先高的bundle中。
注意:
资源会被打包到优先级高的bundle,是指被预制体、场景静态引用到的资源。
例如:
1,bundleA 的场景scene1 静态引用了资源a,bundleA的优先级是6。
2,bundleB的场景 scene1 静态引用了资源a,bundleB的优先级是5。
资源a 最终会被打包 bundleA中,bundleB会在config.json 的redirect 重定向字段中记录资源a的uuid与所依赖bundle的deps的索引。通过deps索引找到bundle,再通过uuid找到对应的资源。
优先级设置
同个资源被多个bundle 依赖使用,优先级相同时,则多个bundle中都会含有该资源。其他情况则会被打包到优先级高的bundle中。
bundle包加载顺序
cocos 默认的自动加载顺序,如下图:
所以对应公共资源,即多个bundle都会使用到的资源,我们建议把该资源存放到 resources 目录下,因为整个cocos项目资源加载流程是:优先加载 internal bundle,再加载resouces bundle,最后加载main bundle。这是cocos固定的加载顺序,无法改变。
应用问题
- 当多个bundle包都会使用的资源,我们应该把该资源存放到公共的resouces 包中。
- 当某个功能模块所使用到的资源,其他地方并不会使用到,则应在开启一个独立的独立的bundle。
- 当我们的首个场景资源过多,我们为了避免进入首场景的时间过长,可以把首场景资源分出一个bundle。
- 当bundleA、bundleB 都是静态使用了同一个资源时,bundleA的优先级大于 bundleB,则该资源会被打包到 bundleA中。 使用BundleB时,需要先加载bundleA。(应规避这种情况)。
bundle 的加载与释放
内置bundle(internal、resouces、main)cocos会对其自动加载。对于自定义bundle,我们需要手动加载。
官方文档
bundle 包跨项目使用
因为bundle包是一个完全独立的包,含有资源和脚本,所以我们可以跨项目使用。但是需要注意:引擎版本需要相同,因为不同的引擎,其bunlde包的结构、加载、解析等可能不同。