U3DFrameWorkDemo:四资源打包和热更

Posted 寡人正在Coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的,无法使用,拓展时有时需要派生自一些低级的类。参考:

Unity3D开发之手游热更,基于GameFramework(GF),涵盖Android|IOS|资源包|打包等功能非专业团队勿扰

最近公司团队需要一个热更功能

 

没想到自己3天就做出来了,当然作者有多年Unity手游lua热更经验

由于公司希望是C#的热更,所以保守采用了ILRuntime(似乎也可以用最新的il2cpp热更)

虽然说核心并非c#语言,更多应该是资源的热更,但研发3天完成,是不是有点太儿戏

举个例子:你去健身房,3天减20斤可否

可以的:把你身上的肉切下来就可以了

同理:站在巨人的肩膀上,才能看的更远,走的更高

所以:我们使用了大神的GameFramework,2019年发布到GIThub,当年2019比较火

一般框架得通病

我有多反感这种框架就不在这里展开说了,一般这种框架为了通用性,就放弃了实用性,更不用想个人团队定制化;一般这种框架说自己有多强,就有多难配置和初始化,甚至使用过程一堆天坑等着你

我们缺的是一个小目标么?我们缺的是王健林爸爸的那一个亿

来看看,哥做了哪些修复,才让GF框架变得稍微能使用:

热更的需求,无非就是打包成AB资源包,使得手机端匹配手机端资源,PC端匹配PC端资源

再深层次得需求,资源包含DataList,可做Mapping表

资源包含脚本,可注入,我们还是使用ILRuntime

(可参照下面的HybirdCLR,但是很多坑)

直接生成整体包和Version文件(官方觉得这属于自定义,非框架本身,但却是我们的痛点)

 

已使用phpStudy_pro测试

(只需要启动ngix 服务)

这不是一个框架,更不是一个方案,(这一个)完整的能直接接入的代码,公司在用,总共也就研究了3天,轻松接入单机,带各种小工具,修复了10+个BUG,需要的电邮联系,

sidney9111 at gmail dot com

非团队勿扰

扩展阅读:

Unity GameFramework-打包和热更新模块(Resources资源)_东方天滨的博客-CSDN博客_unity打包热更新

GameFramework_HybridCLR——Window打包、热更_谢谢希望的博客-CSDN博客

以上是关于U3DFrameWorkDemo:四资源打包和热更的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D开发之手游热更,基于GameFramework(GF),涵盖Android|IOS|资源包|打包等功能非专业团队勿扰

Unity3D开发之手游热更,基于GameFramework(GF),涵盖Android|IOS|资源包|打包等功能非专业团队勿扰

游戏开发探究Unity Addressables资源管理方式用起来太爽了,资源打包加载热更变得如此轻松(Addressable Asset System | 简称AA)

游戏开发探究Unity Addressables资源管理方式用起来太爽了,资源打包加载热更变得如此轻松(Addressable Asset System | 简称AA)

游戏开发探究Unity Addressables资源管理方式用起来太爽了,资源打包加载热更变得如此轻松(Addressable Asset System | 简称AA)

Unity资源热更