title: 模块化热更思路
categories: Others
tags: [热更, 模块化, 分包]
date: 2023-02-18 01:04:57
comments: false
mathjax: true
toc: true
模块化热更
浅浅的记录一下访问破 200w (But, I don’t care about this.)
前篇
- 只谈思路, 不贴实现代码.
需求
- 游戏类型属于合集类, 也就是一个 大厅 + 多个小游戏模块, 每个小游戏模块之间互不关联. 如果不做模块化热更的话, 那么初始包的大小就会很大, 随着小游戏模块的数量增加而增加, 因此就可以考虑把每一小游戏模块分割出来, 在需要用的时候在去热更, 那么出来的初始包的大小就是只有一个大厅, 或者预置几个小游戏模块, 其他的小游戏模块运行时去更新下来, 这样包体就不会受小游戏模块的限制.
思路
游戏内的资源主要还是 贴图之类的 美术资源最占大头, 脚本资源 和 配置表 都只占很小很小, 所以只需要在美术资源这一块去着手处理即可.
打包
-
以前打 patch 的还是怎么打, 只需要最后在打包的时候, 把 patch 复制一份副本用来打包, 其中把 每个小游戏模块的 美术资源剔除掉, 只留下 大厅模块 美术资源, 剔除掉的模块的资源生成一个 db 记录表, 里面记录所有剔除掉的模块资源, 且每一个模块一个 db 记录, 如:
每个 db (1001.db, 1002.db, 1003.db, …) 记录表记录的就是的剔除掉的, 也就是需要热更的资源, 如: 1003.db
资源引用关系
因为模块可能不存在, 所以大厅与模块之间的就必须遵循一些条件, 如图:
- 大厅 (lobby) 只能引用 大厅 的资源, 不能引用模块的资源
- 模块 (mod01, mod02) 能引用 同模块 和 大厅 的资源, 不能引用其他模块的资源
引用关系的检测逻辑必须在 打包, 打 patch 逻辑之前走一遍, 确保没有问题.
运行时热更模块
假设最新的 db 记录文件是 1003.db, 那么可以用一个如 old_1003.db 的 db 记录去记录本地已有的旧资源
- 首先进入大厅前, 会先进行更新大厅, 此时会把模块资源的 1003.db 记录表下载下来, 覆盖掉旧的
- 然后进入模块 1003 前, 先去对比 1003.db 和 old_1003.db 的 md5 值是否一致
- 如果不一致, 说明此时需要去更新新的 1003 模块的资源, 把里面有 md5 差异的资源下载下来, 完成之后写入, 用 1003.db 覆盖到 old_1003.db, 完成模块的更新
- 如果一致, 这说明没有资源需要更新
优化
-
因为单文件的更新速度大部分情况下都会快于散文件的批量更新.
在首次热更模块时, 可以把模块资源都打包为一个 zip 文件, 下载下来再本地解压, 里面包含的就是 old_1003.db 资源记录表 和 需要热更的文件.
踩坑
- 在 Android 平台, 包内文件如果不存在, 去拷贝这个不存在的文件到持久化路径下, 会成功拷贝, 但是会是个空文件, 所以读取文件要进行判空处理 (被坑了 几十分钟).