代码参考
代码文件参考下述详解的类图,工程参考第零章工程说明
概述
热更新方便用户更新,增加用户的留存量。它依赖打包生成的版本文件。
思路
打包
- 考虑分包策略,包体太大加载速度慢且可能有无效的内存冗余,包体太小可能会频繁加载AB造成效率下降。核心思想是把用到的东西放在一起,通用的资源分类打包。
- 标记哪些资源被分配到哪个包里,最好做一个编辑器用于分包。如果对粒度要求不高的话,可以考虑使用文件夹来划分包体,它天然具有文件的分类属性和路径作为Key的唯一性
- 有些文件U3D是不认识的,在打包时需要转换成U3D认识的文件,如Lua、Json可以转换成Txt文本文件。
- 需要建立资源路径到到包体名的映射,可以在打包时生成映射文件,在使用文件夹分包时,因为文件夹时树形结构,则可以使用搜索树根据资源路径来查找包名,从而省去映射文件的开销
- 对每个资源生成版本标识,可以使用MD5。同时也需要对包的版本号进行维护,方便热更时比对版本号。
- 每次打包要更新Manifest文件,Manifest文件包含了依赖包清单和资产清单
- 把更新包打压缩包方便传输
热更
- 比对版本号,建立下载队列
- 使用断点续传来减少用户下载中断的损失
- 更新版本号
- 更新后可能更新了已加载的脚本,需要重新初始化这些脚本
实现
打包与热更
打包
- BundleSchemaWnd:分包编辑器,生成分包信息
- PublishWnd:基础包打包编辑器界面
- UpdateWnd:更新包打包编辑器,显示差异资源
- BuildScript:基础包打包脚本
- UpdateBuildScript:更新包打包脚本,打包后会把更新文件打Zip包
- BundleBuilder:收集和检查打包信息,调用引擎API打包,生成资源MD5标识
- BuildUtil:打包相关工具方法
- BuildConst:打包相关路径等配置
- VersionUtil:维护版本文件相关工具方法
热更新
- HotUpdateMgr:热更管理,检查生成下载队列调用下载器下载(下载任务生产者),处理外部监听委托
- UpdateTask:下载任务,包含版本、资源包url、保存路径等等
- Downloader:下载器,具体处理下载任务(下载任务消费者)
- DownloadBreakResumeHandle:派生自DownloadHandlerScript,处理断点续传
打包流程
基础包
- 初始化打包上下文,传入要打包的目录等参数
更新包
- 收集差异文件进而收集差异目录
- 打包成功后把更新的资源打成zip包
打包流程
- U3D不认识的资源转换和恢复
- 依据目录检出资产并生成打包信息
- 打包完成更新MD5文件
更新流程
- 比对本地与远程的版本差异,生成版本下载队列
- 下载队列依次下载更新包解压
- 更新完成热重启
备注
- 图集、shader变体U3D有做特殊打包机制需要一些配置文件,参考
- Uniy SBP(Scriptable Build Pipeline) 在大型项目应该会比较实用(多线程多机器构建),其特性是粒度更细的多任务构建、内容定制、profier,以及使用缓存加速多次构建。参考:
- Unity有个插件Addressables可以快速建构打包和热更模块,有些地方需要开发者自己拓展,尤其是本地静态资源无法增量打包,需要把远程动态资源也打到基础包里,另外,Addressables的代码暴露也相当奇怪,某些关键节点是Internal的,无法使用,拓展时有时需要派生自一些低级的类。参考: