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有做特殊打包机制需要一些配置文件,参考
- Uniy SBP(Scriptable Build Pipeline) 在大型项目应该会比较实用(多线程多机器构建),其特性是粒度更细的多任务构建、内容定制、profier,以及使用缓存加速多次构建。参考:
- Unity有个插件Addressables可以快速建构打包和热更模块,有些地方需要开发者自己拓展,尤其是本地静态资源无法增量打包,需要把远程动态资源也打到基础包里,另外,Addressables的代码暴露也相当奇怪,某些关键节点是Internal的,无法使用,拓展时有时需要派生自一些低级的类。参考:
U3DFrameWorkDemo:四、资源打包和热更的更多相关文章
- 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...
- 实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面
简介 一个简单的关于页面,有一个图片,版本号,App名称等,着重演示各个系列的文章完整集成示例. 动机与意义 这是系列文章的最后一篇.今天抽空写下,收下尾.文章本身会在第四篇的基础上,简单扩充下代码, ...
- 实现iOS图片等资源文件的热更新化(零): 序
必要的序 以后在写系列文章,准备把基本的规划和动机等,单独作为一个小的序言部分给独立出来.序言部分,可以较为完整地交待系列文章的写作动机,所展示的编码技术可能的应用场景等.个人,我还是比较看重文章或者 ...
- 实现iOS图片等资源文件的热更新化(四): 一个最小化的补丁更新逻辑
简介 以前写过一个补丁更新的文章,此处会做一个更精简的最小化实现,以便于集成.为了使逻辑具有通用性,将剥离对AFNetworking和ReativeCocoa的依赖.原来的文章,可以先看这里: htt ...
- 实现iOS图片等资源文件的热更新化(一): 从Images.xcassets导出合适的图片
本文会基于一个已有的脚本工具自动导出所有的图片;最终给出的是一个从 Images.xcassets 到基于文件夹的精简 合适 的图片资源集的完整过程.难点在于从完整图片集到精简图片集,肯定是基于一个定 ...
- 实现iOS图片等资源文件的热更新化(二):自定义的动态 imageNamed
这篇文章,要解决的是,使用一个自定义的 imageNamed 函数来替代系统的 imageNamed 函数.内部逻辑,将贯穿对比论证 关于"合适"的图片的定义.对iOS加载图片的规 ...
- Unity资源打包学习笔记(二)、如何实现高效的unity AssetBundle热更新
转载请标明出处:http://www.cnblogs.com/zblade/ 0x01 目的 在实际的游戏开发中,对于游戏都需要进行打补丁的操作,毕竟,测试是有限的,而bug是无法预估的.那么在手游中 ...
- Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建
前言 前面铺垫了这么久,终于要开始写热更新了. Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新. 资源更新是Unity本来就支持的,在各大平台也都能用.而脚本的热更新在iOS平台 ...
- 跟我从零基础学习Unity3D开发--资源打包篇(AssetBundle)
好久没更新了,一直在加班敢项目进度.这里和关注我的博客的童鞋表示一下歉意!这里有我录的Unity3D从零开始的视频教程大家可以关注一下:http://www.imooc.com/view/555 视 ...
- 优化单页面开发环境:webpack与react的运行时打包与热更新
前面两篇文章介绍初步搭建单页面应用的开发环境: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-router实现单页面应用路由 这 ...
随机推荐
- [arc133e]Cyclic Medians
E - Cyclic Medians 看到中位数,就是经典套路:将\(\geq\)中位数的都赋值为\(1\),\(<\)的赋值为\(0\) 那么对于数\(A\),就等于\(\sum_{i=1}^ ...
- dotNet6(.net core 6) Big5'不是受支持的编码名称。有关定义自定义编码的信息,请参阅有关编码的文档。RegisterProvider方法
https://www.skyfinder.cc/2021/12/17/net-core-register-encoding/#:~:text=%E5%9C%A8%E4%BD%BF%E7%94%A8. ...
- SQL使用行锁
https://www.cnblogs.com/wolfocme110/p/14727133.html 行锁使用需要注意 1.ROWLOCK行级锁确保在用户取得被更新的行,到该行进行更新,这段时间内不 ...
- YOLOv8模型持久化与版本控制:管理模型生命周期的高效方法
在深度学习领域,模型的持久化和版本控制对于确保模型的稳定性.可复用性和可追踪性至关重要.本文将详细介绍如何使用Ultralytics YOLOv8进行模型持久化,并展示如何通过版本控制工具管理模型的生 ...
- API网关是什么?
API网关是什么? API网关很多人都知道它的实现原理,但是并不清楚它存在的意义和背景是什么,这里我给大家通俗易懂地讲解下!举个例子,假设你正在开发一个电商网站,那么这里会涉及到很多后端的微服务,比如 ...
- SciTech-Mathmatics-Probability+Statistics:Quantifing Uncertainty_统计分析: SciTech-Mathmatics-Probability+Statistics:Quantifing Uncertainty_统计数据分析: PROBABILITY DISTRIBUTIONS(常用概率分布)
一般数学表示方法 概率数学表示方法 \(\large \begin{array}{rl} \\ \bm{X}:& 符合某种概率分布的Random\ Variable(随机变量) \\ \bm{ ...
- SciTech-Mathmatics-Real Analysis-神奇的Cantor Set Theorem康托尔集 + Bolzono-Weierstrass Theorem + Bernstein Theorem
Cantor Set Priciple: 1-1 bi-directional mapping to determine whether two sets(infinite or finite) A ...
- SciTech-BigDataAIML-LLM-Transformer Series-Positional Encoding: 位置编码: 统计模型(够多参数够高精度)+"够大数据"凝聚客观规律"预训练+深度NN(学习规律).
词汇 $\large MI $(Mobile Internet): 移动互联网 $\large IoT $(Internet of Things): 万物互联网 \(\large Supervised ...
- 【深入解剖Spring事务管理】原理、传播机制与12大失效场景避坑指南
Spring 事务管理是构建健壮企业应用的核心,其核心原理.@Transactional注解的工作机制.传播行为及失效场景是开发者必须掌握的关键点.下面我将逐一深入解析: 一.Spring 事务管理的 ...
- 银河麒麟安装Docker-国产化-九五小庞
银河麒麟高级服务器操作系统 V10 是针对企业级关键业务,适应虚拟化. 云计算.大数据.工业互联网时代对主机系统可靠性.安全性.性能.扩展性和 实时性的需求,依据 CMMI 5 级标准研制的提供内生 ...