首包直降70%,游戏分包最佳实践(视频+图文)

本公众号由以下老铁赞助,感谢他们❗️

328c0139a0b7c6ee9db090ded27f5fde.png20b4b55703196e2352288b34ee1759bd.png

3dd1488657dc48cd49ed7d0afbe413fa.pngd6c4e9b51c138db7ca8ef6e224c40c6f.jpeg

昨天在群里,有群友对自己的小游戏加载速度不满,花钱买来的用户,超过50%还没进游戏就流失了,心疼不已!

ba12972dc018963434c90218035c415a.png

慢一秒就7%的首日用户流失,16M的资源包,仅靠引擎分离是远远不够的。

正好前两天,麒麟子刚刚制作了一条 Cocos 微信小游戏分包视频,结合之前的图文教程再好不过了。还不会小游戏分包的朋友,一定要学起来,这可是钱啊!

Error: 系统错误,错误码:80051,source
size 9424KB exceed max limit 4MB

相信 90% 的朋友第一次发布小游戏时,都会遇上首包限制的问题。3eed1e3131613303154c0e2d3d947ae5.jpeg社区中有非常多关于如何减少首包大小的文章,但在 Cocos Creator 3.8 版本发布之后,引擎自带分包功能已经非常强大,在不改动引擎机制的情况下,就足以应对常见项目需求。

今天我们就以 Cocos Creator 自带的 Hello World 为例,一步步实现包体优化,最终效果如下:

项目优化后优化前
总包大小3.73MB9.22MB
主包大小2.14MB9.22MB
分包大小1.59MB9.22MB
cocos-js1.68MB3.95MB
包数量21

具体情况可以点开下图查看:a044368cc730d0959234c4aa96e38f3c.png

接下来,我们从新建项目开始,一步步优化。

  • 1.引擎裁剪

  • 2.分包设置

  • 3.资源引用剔除

  • 4.大文件排查

  • 5.WASM 分离

一、新建项目

  1. 新建项目面板,版本选择 Cocos Creator 3.8.2(建议用最新版本),模板选择 “Hello World”,即可创建带有素材的测试项目。15f8b7817c051618bd5849f465a512d9.png

  2. 不做任何修改,发布到微信小游戏

  3. 用微信开发者工具打开,选择“代码依赖分析”,可以看到如下数据5c502504717c871623e704216f075b64.png

我们可以看到它只有一个主包,总包大小已经 9.22 MB了,不做处理肯定是不行的。

二、引擎裁剪

定位到主菜单 -> 项目 -> 项目设置 -> 功能裁剪。17fca02a4d767429f9212548a102e34e.png

可以看到这里面提供了许多可选项。我们移除 WebGL 2.0视频WebviewMarionette 动画系统基础几何体地形光照探针2D 物理系统2D 粒子系统Tiled 地图Spine 动画Dragon BonesWebSocket

WebSocket 是针对原生平台的选项,小游戏和 Web 平台可以都去掉,不影响 WebSocket 使用

以上移模块除后,就是一个常见 3D 项目所需的基础模块了。

实际上,在这个例子中,音频缓动系统3D 物理系统3D 粒子系统 因为并没有使用,都是可以移除的。但我们作为测试,尽可能保留大部分项目都需要用到的模块,才能符合商业项目需求。

总的来说就是:把不需要的模块都移除掉。

再次发布到微信小游戏,可以看到下面的结果:d03c6fede3d92ee0bf3ec8e9ac14359f.png

项目优化后优化前
总包大小7.61MB9.22MB
主包大小7.61MB9.22MB
cocos-js2.46 MB3.95MB

一般的项目,都会带有许多游戏素材,光是裁剪肯定是不够的。接下来,我们通过分包设置,将游戏内容从主包里分离。

三、分包设置

3.1 调整目录

新建一个 game 文件夹,然后把所有其它文件都拖进去,最终目录结构如下:80796964c280672be5b7a8271d5eefad.png

拖进去后,如果发现 material 和 model 文件夹有残留,直接删除即可。

3.2 设置分包

选中 game 目录,做以下操作:

e92e35c0d302f93497bf6c848053d3b7.png
  1. 在右边的属性面板中,选择配置为 Bundle

  2. 点击“编辑”按钮,打开 Bundle 配置面板

  3. 勾选“单独配置”

  4. 微信小游戏一栏选择“小游戏分包”

  5. 点击“保存”

这样一来,分包就设置好了。

3.3 制作加载场景

分包不会自动加载,因此,我们需要制作一个场景用于加载。

  1. 在 assets 目录下新建场景起名为 "start"

  2. 在 assets 目录下新建一个脚本起名为 "Start"

  3. 在 Start.ts 中编写如下代码

assetManager.loadBundle("game",(err,bundle:AssetManager.Bundle)=>{
    director.loadScene("main");
});
  1. 在 start 场景中,新建一个空节点,起名为 Start

  2. 将 Start.ts 组件挂上去

  3. 在 start 场景上放一个小 Logo,以避免什么都没有显示

最终的项目目录和画面可能如下:

27d40f0a3942ffc1dfea6bdd19041ceb.png

在构建面板,将刚刚新建的 start 场景选择为启动场景,再次打包,可以在微信小游戏开发工具中看到如下数据:

a6d70c75506274e5db0570c2507c350e.png
项目优化后优化前
总包大小9.94MB7.61MB
主包大小4.02MB7.61MB
分包大小5.92MB-
cocos-js2.47 MB2.46MB

可以看到,在优化后,虽然主包下降了,但总包大小上升了。

这里就得提到一个隐含的重要知识点了。Cocos Creator 有以下几种包:

类型优先级用途资源引用方式
internal21内置资源仅打包已使用资源
resources8内置 bundle打包所有资源
main7主包仅打包已使用资源
bundle1+普通分包打包所有资源

Bundle 优先级

assets 目录下的资源,如果不处于 bundle 中( resources 是一个内置的bundle,行为和普通 bundle 一致)时,则仅会将使用过的资源入对应的bundle包。

  • 当被多个不同优先级的包同时引用时,打入优先级最高的那个包。

  • 当被多个相同优先级的包同时引用时,会每个包都打入。

对于内置 bundle,internal, resources, main 来说,优先级还决定了加载顺序。可以看出, resources 会比 main 先加载。因此,应该尽量避免在 resources 目录放置过多内容,大型项目可以直接避免使用 resources 目录。

四、资源引用剔除

有了以上的 Bundle 和优先级相关的知识后,我们可以知道,Bundle 中只需要放以下几个内容:

  1. 需要的场景

  2. 需要动态加载的素材(Prefab、图片、动画、音频等)

对于不需要动态加载的,我们通过场景引用,引擎会自动帮我们处理好资源关系。

接下来,我们新建一个 res 目录,并且把 game 目录下除 scene 以外的文件夹移动过去,得到的目录结构如下:

5dfa475f91a6c282d111bb1667bb4018.png
项目优化后优化前
总包大小8.50MB9.94MB
主包大小4.02MB4.02MB
分包大小4.48MB5.92
cocos-js2.47 MB2.47MB

可以发现,包体大小还是不够理想,那么我们就要来具体分析占用包体较大的文件。

主包排查

通过查看分布图,我们可以发现,主包除了代码外,assets 目录还占用了 1.36 MB。而我们放的 logo.jpg 只有 41 KB,显示是超出预期的。

c334afc4321195e85ad845c05d6d653b.png

定位到对应文件夹后,发现是一堆天空盒贴图:

0589420e90fc3fd8ebd5c770f31e0c49.png

这就好办了!

由于我们的 start 场景不需要显示天空盒,所以只需要去除这个引用就行。

  1. 打开 start 场景

  2. 关闭场景面板上的 Skybox,移除场景面板上的天空盒引用5e572c93e4f087a156106e4575416a8d.png

  3. Main Camera 的 ClearFlags 设置为 SOLID_COLOR

再次发布版本,可以看到主包数据变化:

186f420696ef11e3c39e6335cc6440b2.png
项目优化后优化前
总包大小7.66MB8.50MB
主包大小3.19MB4.02MB
分包大小4.48MB4.48MB
cocos-js2.47 MB2.47MB

可以看到,最终我们得到了 7.66 MB 的总包大小,并且主包控制在了 3.19 MB。已经可以满足我们的需求。

但这并非结束,甚至,优化才刚刚开始。

大文件排查

通过依赖分析图,我们可以看到子包里的 native 有 3.99 MB 占用。3dc564d65a70ea28e1dbfdc141fc6c1d.png

native 下一般是图片为主,我们定位到目录中可以看到是 Hello World 中使用的天空盒。

c8cc544fead9cb5970d7ab6dbd8d54db.png

在 Cocos Creator 中查看,可以看到它有 4096 x 3072 这么大

eecf01c92cb2ecb80aadd87e0448a1e4.png

对于这个天空盒,根本不需要这么高的精度,通过图片工具,直接将它改为 1024 x 768。

fadee6981a2cc8836ac27b5b0d730b5b.png

同时,我们发现 seafloor,stone 等分辨率,是可以缩小一倍的。

虽然可以使用 tinypng 等工具对图片进行压缩,但建议在压缩之前调整好合理的分辨率,能够降低内存开销。

将这些素材处理好之后,再次打包。

964c1f1b159f9a851f5a8750eb5d4d3e.png
项目优化后优化前
总包大小4.77MB7.66MB
主包大小3.19MB3.19MB
分包大小1.59MB2.18MB
cocos-js2.47 MB2.47MB

WASM 分离

虽然主包已经控制在了 3.19 MB。但如果我们要同时开启 Spine,Box2D 等功能,或者要在 start 场景里加载一些资源, 0.81 MB 的空间还是略显拮据。

因此,引擎在小游戏打包时,提供了 WASM 分离功能。所有开启了 WASM 的模块,都会在打包时,放入子包,以减少主包占用。

37aae3d9a320209105fd2a331d6e9042.png

勾选后再次打包,可以看到:e8807f6390a238c90baf129f396a6ff9.png

项目优化后优化前
总包大小5.39MB5.37MB
主包大小2.70MB3.19MB
分包1大小1.59MB1.59MB
分包2大小463KB-
分包3大小57KB-
cocos-js1.99 MB2.47MB

3D 项目极限尝试

其实有许多 3D 项目和这个 HelloWorld 一样,不需要物理,也不需要 3D 粒子系统,那么可能是如下数据:

e2faf742d08a7ec2d861d36d8ede60f6.png

2D 项目极限尝试

2f8055abd017e648c205b79337f9a17d.jpeg

如果你是一个 2D 项目,需要 Spine,但是不需要物理、2D 粒子等。

Cocos Creator 可以做到主包 1.94 MB,cocos-js 1.64 MB。

21da0bee21490cec9f1bb676789a90ff.png

如果觉得默认的配置还不够满意,可以自己进一步裁剪引擎,达到最小化功能。

分包常用知识

  1. 小游戏分包可以包含代码

  2. 远程包不可以包含代码,如果将包含代码的包设置为远程包,则代码会自动被抽离

  3. 非 ZIP 格式的分包,在调用 assetManager.loadBundle 时,只会加载资源列表,不会加载所有资源

  4. ZIP 格式的分包,会在第一次加载完成后解压,后面的加载请求会从缓存中读取

  5. 分包内的代码,在加载完成后自动装载执行,但是卸载分包不会卸载代码

附1:小游戏分包机制

随着小游戏的玩法越来越丰富,开发者对于扩大包大小的需求越来越强烈,所以众多小游戏平台都推出了分包加载这一个功能。

所谓的分包加载,即把游戏内容按一定规则拆分这几包,在首次启动时先下载必要的包,这个必要的包我们称为「主包」,开发者可以在主包内触发其它分包的下载,从而把首次启动的下载耗时分散到游戏运行中。

附2:分包限制

目前小游戏分包大小有以下限制:

  • 整个小游戏所有主包+分包大小不超过 20M(开通虚拟支付后的小游戏不超过30M)

  • 主包不超过 4M

  • 单个普通分包不限制大小,但受总包大小限制

  • 单个独立分包不超过 4M

独立分包是小游戏中一种特殊类型的分包,可以独立于主包和其他分包运行,对于一些大厅子游戏玩法的游戏很好用,今天暂不讨论。

希望这篇文章能够帮助到大家!

下面是广告时间!

时隔5个月,小蚂蚁的微信小游戏买量实战专题已正式上线,目前已接近300人。

d73aaf71e60b6598f59182bd29d84c23.jpeg

如果你对小游戏买量充满疑惑,建议你先读完这篇内容,再决定是否要跟着小蚂蚁学习他的这套微信小游戏买量操作的思路。

下面视频是去年12.12,小蚂蚁在晓衡直播间的连麦分享精华。

之后,晓衡又与一些大佬交流、讨论并收集信息,再加上个人的一此思考,从买量的 道、法、术、器 四个方面做了一点总结《个人开发者,小游戏买量逻辑实战指南》推荐阅读。

游戏开发,副业变现

晓衡的愿景是助力 1000 位个人开发者

一年独立挣钱10W+

11b11b6639f60b0cb33aa6828c474d76.jpeg

欢迎加晓衡微信

c1058407fa540af3238eea2dc4cdd99f.gif

55e2a7ed0a01050109649f4624016afe.gif

求求你,千万不要讲电子软著了!根本没这

MMORPG 终于来了!9月新品推荐

一群看穿市场的开发者们!7月精品推荐

从入门到爆款?16套视频教程助你起飞

用这个看微信小游戏排行榜,真是太方便了!

吃透这2个指标!真正读懂微信「畅玩榜」

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值