最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球热头条丨U3DFrameWorkDemo:四、资源打包和热更

来源:博客园


(资料图片仅供参考)

代码参考

代码文件参考下述详解的类图,工程参考第零章工程说明

概述

热更新方便用户更新,增加用户的留存量。它依赖打包生成的版本文件。

思路

打包

  • 考虑分包策略,包体太大加载速度慢且可能有无效的内存冗余,包体太小可能会频繁加载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有做特殊打包机制需要一些配置文件,参考
    • 跳转链接:U3D2020后的图集打包
    • 跳转链接:Shader变体收集与打包
  • Uniy SBP(Scriptable Build Pipeline) 在大型项目应该会比较实用(多线程多机器构建),其特性是粒度更细的多任务构建、内容定制、profier,以及使用缓存加速多次构建。参考:
    • Unity SBP
  • Unity有个插件Addressables可以快速建构打包和热更模块,有些地方需要开发者自己拓展,尤其是本地静态资源无法增量打包,需要把远程动态资源也打到基础包里,另外,Addressables的代码暴露也相当奇怪,某些关键节点是Internal的,无法使用,拓展时有时需要派生自一些低级的类。参考:
    • 跳转链接:Addressables使用参考
    • 拓展优化基础包和更新包参考

关键词: