模块化热更思路

Posted 蝶泳奈何桥.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块化热更思路相关的知识,希望对你有一定的参考价值。


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.)


前篇

  • 只谈思路, 不贴实现代码.

需求

  • 游戏类型属于合集类, 也就是一个 大厅 + 多个小游戏模块, 每个小游戏模块之间互不关联. 如果不做模块化热更的话, 那么初始包的大小就会很大, 随着小游戏模块的数量增加而增加, 因此就可以考虑把每一小游戏模块分割出来, 在需要用的时候在去热更, 那么出来的初始包的大小就是只有一个大厅, 或者预置几个小游戏模块, 其他的小游戏模块运行时去更新下来, 这样包体就不会受小游戏模块的限制.

思路

游戏内的资源主要还是 贴图之类的 美术资源最占大头, 脚本资源 和 配置表 都只占很小很小, 所以只需要在美术资源这一块去着手处理即可.

打包

  1. 以前打 patch 的还是怎么打, 只需要最后在打包的时候, 把 patch 复制一份副本用来打包, 其中把 每个小游戏模块的 美术资源剔除掉, 只留下 大厅模块 美术资源, 剔除掉的模块的资源生成一个 db 记录表, 里面记录所有剔除掉的模块资源, 且每一个模块一个 db 记录, 如:

    每个 db (1001.db, 1002.db, 1003.db, …) 记录表记录的就是的剔除掉的, 也就是需要热更的资源, 如: 1003.db


资源引用关系

因为模块可能不存在, 所以大厅与模块之间的就必须遵循一些条件, 如图:

  1. 大厅 (lobby) 只能引用 大厅 的资源, 不能引用模块的资源
  2. 模块 (mod01, mod02) 能引用 同模块 和 大厅 的资源, 不能引用其他模块的资源

引用关系的检测逻辑必须在 打包, 打 patch 逻辑之前走一遍, 确保没有问题.


运行时热更模块

假设最新的 db 记录文件是 1003.db, 那么可以用一个如 old_1003.db 的 db 记录去记录本地已有的旧资源

  1. 首先进入大厅前, 会先进行更新大厅, 此时会把模块资源的 1003.db 记录表下载下来, 覆盖掉旧的
  2. 然后进入模块 1003 前, 先去对比 1003.db 和 old_1003.db 的 md5 值是否一致
    1. 如果不一致, 说明此时需要去更新新的 1003 模块的资源, 把里面有 md5 差异的资源下载下来, 完成之后写入, 用 1003.db 覆盖到 old_1003.db, 完成模块的更新
    2. 如果一致, 这说明没有资源需要更新

优化

  1. 因为单文件的更新速度大部分情况下都会快于散文件的批量更新.

    在首次热更模块时, 可以把模块资源都打包为一个 zip 文件, 下载下来再本地解压, 里面包含的就是 old_1003.db 资源记录表 和 需要热更的文件.


踩坑

  1. android 平台, 包内文件如果不存在, 去拷贝这个不存在的文件到持久化路径下, 会成功拷贝, 但是会是个空文件, 所以读取文件要进行判空处理 (被坑了 几十分钟).

以上是关于模块化热更思路的主要内容,如果未能解决你的问题,请参考以下文章

U3DFrameWorkDemo:四资源打包和热更

Unity热更模块基于 HybridCLR + Addressable

如何评价腾讯在Unity下的xLua热更方案

Unity 接入 ILRuntime 热更方案

Unity 接入 ILRuntime 热更方案

浅谈 Node.js 热更新