Unity Game FrameWork—框架学习—ab打包流程解析

news2024/11/27 15:43:01

UGF资源更新与管理
https://www.jianshu.com/p/80bff8c9004a

打包配置

ResourceBuilder.xml文件保存了打包配置信息
[图片]
参数:
InternalResourceVersion:内部版本号
Platforms:生成的ab资源所对应平台编号,二进制左移,与或非运算得到
AssetBundleCompression:压缩格式标号,不压缩,LZ4压缩,LZMA压缩
CompressionHelperTypeName:压缩解压缩辅助器类型名称
AdditionalCompressionSelected:是否进行再压缩以降低传输开销
ForceRebuildAssetBundleSelected:是否强制重新构建 AssetBundle
BuildEventHandlerTypeName:构建ab的相关事件类类型名称
OutputDirectory:ab输出文件夹,其他输出目录根据该目录派生
OutputPackageSelected:是否生成package资源
OutputFullSelected:是否生成full资源
OutputPackedSelected:是否生成Packed资源
各个目录解释说明:
Working: Unity 生成 AssetBundle 时的工作目录。
Package: 为单机模式生成的文件的所在目录,若游戏是单机游戏,生成结束后将此目录中对应平台的文件拷贝至 StreamingAssets 后构建 App 即可。
Full: 为可更新模式生成的完整文件包的所在目录,若游戏是网络游戏,生成结束后应将此目录上传至资源服务器,供玩家下载用。
Packed: 为可更新模式生成的文件的所在目录,若游戏是网络游戏,生成结束后将此目录中对应平台的文件拷贝至 StreamingAssets 后构建 App 即可。一个 AssetBundle 是否会生成到 Output Packed Path,取决与这个 AssetBundle 是否在 AssetBundle 编辑工具中被标记为 Packed。(此目录下存储的是随APP一起发布的资源)
BuildReport: AB包和非AB包文件,在GF中被统一抽象为 Resource 文件,文件后缀为.dat ,在我们的资源列表中,记录的即是这些 .dat 资源文件的资源信息,信息中包含了这些资源文件的名称,hashcode,长度,zipHashcode,zip长度,是否AB包,加载设置,等等信息。

打包流程

打包的流程执行过程从按下Start Build Resources按钮开始
[图片]
找到ResourceBuilder脚本,当点下按钮bool类型变量m_OrderBuildResources值变为true时,开始执行BuildResources()方法
private void Update()
{
if (m_OrderBuildResources)
{
m_OrderBuildResources = false;
BuildResources();
}
}

类关系
类的创建关系如下
ResourceBuilder:资源生成器(入口)
ResourceBuilderController:资源构建控制器
ResourceAnalyzerController:资源分析控制器
ResourceCollection:资源集合
Resource:ab包所含资源信息
Asset :资源文件信息
//资源生成器(入口)
ResourceBuilder : EditorWindow
{
private ResourceBuilderController m_Controller = null;
}
//资源构建控制器
ResourceBuilderController
{
ab包所含的资源文件数量127
private readonly ResourceCollection m_ResourceCollection;
private readonly ResourceAnalyzerController m_ResourceAnalyzerController;
//ab资源全路径-ab包信息键值对,ab包的数量116
private readonly SortedDictionary<string, ResourceData> m_ResourceDatas;
}
//资源分析控制器
ResourceAnalyzerController
{
private readonly ResourceCollection m_ResourceCollection;
//每个资源文件所依赖的资源
private readonly Dictionary<string, DependencyData> m_DependencyDatas;
//每个被依赖的资源(a)所对应的依赖它的资源(b,c)所形成的列表,(b,c)属于ab包里的资源
private readonly Dictionary<string, List> m_ScatteredAssets;
//ab资源和散资源综合后的所有依赖关系列表
private readonly List<string[]> m_CircularDependencyDatas;
//依赖关系资源列表(ab+分散),无序集合,查找快速,不会重复
private readonly HashSet m_AnalyzedStamps;
}
//资源集合
ResourceCollection
{
//ab路径-ab资源Resource信息键值对(116)
private readonly SortedDictionary<string, Resource> m_Resources;
//guid-Assets键值对(127)
private readonly SortedDictionary<string, Asset> m_Assets;
}
//ab包所含资源信息
Resource
{
private readonly List m_Assets;//ab包所含资源文件
private readonly List m_ResourceGroups;//所属资源分组
public string Name //ab包名
public string Variant //变体名称
public string FullName //全名,含路径
public AssetType AssetType //资源类型,资源or场景
public bool IsLoadFromBinary //是否从二进制文件加载
public string FileSystem
public LoadType LoadType //资源加载方式类型
public bool Packed //是否是主包资源
}
//资源文件信息
Asset : IComparable
{
public string Guid;//资源文件guid
public string Name;//资源文件名
public Resource Resource;//所属ab包
}
//依赖数据信息
public sealed class DependencyData
{
//所依赖的ab包
private List m_DependencyResources;
//所依赖的ab包内的文件
private List m_DependencyAssets;
//所依赖的散文件名称
private List m_ScatteredDependencyAssetNames;
}
//依赖关系信息
//每个资源文件可能有多个依赖的文件,ab包里的资源文件有多少个依赖关系,就有多少个该结构
struct Stamp
{
private readonly string m_HostAssetName;//资源文件名
private readonly string m_DependencyAssetName;//被依赖的资源文件名
}
入口是ResourceBuilderController.BuildResources()方法,主要流程如下:
1、创建文件系统
生成各个模式的ab资源文件夹
2、设置ab资源生成选项
BuildAssetBundleOptions buildAssetBundleOptions = GetBuildAssetBundleOptions();
3、收集资源信息
m_ResourceCollection.Load()
读取资源信息xml文件(Assets/GameMain/Configs/ResourceCollection.xml)
从ResourceCollection.xml文件获取需要打包的资源信息填充到ResourceCollection类的m_Resources和m_Assets,ResourceCollection类由ResourceBuilderController创建
4、分析依赖资源
分析
m_ResourceAnalyzerController.Analyze();
ResourceAnalyzerController类由ResourceBuilderController创建。ResourceAnalyzerController的m_ResourceCollection资源数据来源于ResourceBuilderController。
该步骤主要填充ResourceAnalyzerController的属性信息m_DependencyDatas
[图片]在这里插入图片描述
List<string[]> m_CircularDependencyDatas= new List<string[]>();
m_CircularDependencyDatas[0]=new string[]{a,b,d,c,b}
m_CircularDependencyDatas[1]=new string[]{b,d,c,b}
m_CircularDependencyDatas[2]=new string[]{c,b,d,c}
m_CircularDependencyDatas[3]=new string[]{e,f,h,e}
m_CircularDependencyDatas[4]=new string[]{f,h,e,f}
m_CircularDependencyDatas[5]=new string[]{h,e,f,h}
如果只有a,e在ab包里面,那么其他所有依赖的b,c,d,f,h,k则也进行统计
5、准备构建ab资源的数据
PrepareBuildData(out assetBundleBuildDatas, out assetBundleResourceDatas, out binaryResourceDatas)
注意,只有assetBundleBuildDatas是编辑器导出AssetsBundle需要的数据,数据从ResourceBuilderController.m_ResourceCollection获取,并不直接依赖于上一步对资源进行的分析,而分析资源所产生的数据为了更直观的显示在分析器面板。也就是说分析的结果并没有对资源进行处理,这一步可以

6、为选定的平台构建资源
BuildResources(Platform.Windows, assetBundleBuildDatas, buildAssetBundleOptions, assetBundleResourceDatas, binaryResourceDatas);
构建资源分为三步
1、生成资源文件及资源及资源列表文件(即以生成路径命名的文件,Windows和Windows.manifest)
AssetBundleManifest assetBundleManifest = BuildPipeline.BuildAssetBundles(workingPath, assetBundleBuildDatas, buildAssetBundleOptions, GetBuildTarget(platform));
利用assetBundleBuildDatas数据生成ab资源,在working目录下
[图片]
2、输出加密的ab包及字节流检验码
关键函数如下,自行查找
ProcessAssetBundle(platform, workingPath, outputPackagePath, outputFullPath, outputPackedPath, AdditionalCompressionSelected, assetBundleResourceDatas[i].Name, assetBundleResourceDatas[i].Variant, assetBundleResourceDatas[i].FileSystem)
ProcessOutput(platform, outputPackagePath, outputFullPath, outputPackedPath, additionalCompressionSelected, name, variant, fileSystem, resourceData, bytes, length, hashCode, compressedLength, compressedHashCode)
3、输出各个平台下加密的列表文件
ProcessPackageVersionList(outputPackagePath, platform);
ProcessReadOnlyVersionList(outputPackedPath, platform);

ab资源加载

DefaultLoadResourceAgentHelper
///
/// 通过加载资源代理辅助器开始异步读取资源文件。
///
/// 要加载资源的完整路径名。
public override void ReadFile(string fullPath)
{
if (m_LoadResourceAgentHelperReadFileCompleteEventHandler == null || m_LoadResourceAgentHelperUpdateEventHandler == null || m_LoadResourceAgentHelperErrorEventHandler == null)
{
Log.Fatal(“Load resource agent helper handler is invalid.”);
return;
}

        m_FileFullPath = fullPath;
        //将本地资源加载到内存
        m_FileAssetBundleCreateRequest = AssetBundle.LoadFromFileAsync(fullPath);
    }

ab构建分析

学习完源码后受益颇深,ab构建中对资源的分析很完整,资源更新使用了增量更新,不用开发人员去关注更新了哪些内容以及资源内容的记录单独打包,及其友好。
资源分析完成后,在项目对资源管理不完善的情况下我们可能会面临两个问题。
每个ab包所依赖的同一个散文件会多次复制打包进每个ab包,是否可以考虑分析界面提供指导如何分类打包,重复通用的散资源单独打包,减少资源的冗余。
据说yooasset、MotionFramework框架对于冗余处理的很好,有待继续学习研究,此处放上链接。
https://zhuanlan.zhihu.com/p/615830582

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1042265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中睿天下受邀参加2023北京数字交通大会暨博览会并发表主题演讲

2023年9月11号由中国交通报社、中国交通运输协会联合主办的2023北京数字交通大会暨博览会&#xff08;简称大会暨博览会&#xff09;在北京中国国际展览中心&#xff08;新馆&#xff09;举行。这次大会主题是“数字新时代、交通新未来”&#xff0c;将聚焦数字交通创新发展&am…

国货拟人AI绘图;500+AI岗位合辑;百川x亚马逊AI黑客松;企业级AI行业图谱;100+LLM面试题与答案 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 上万人涌入抖音国货直播间&#xff0c;朴实「商战」带火国民品牌 谁能想到&#xff0c;李佳琦「华西子事件」意外带火了一众国货品牌的…

C#源码 LIS实验室(检验科)信息系统源码 SaaS模式的Client/Server架构

LIS实验室&#xff08;检验科&#xff09;信息系统&#xff0c;一体化设计&#xff0c;与其他系统无缝连接&#xff0c;全程化条码管理。集申请、采样、核收、计费、检验、审核、发布、质控、查询、耗材控制等检验科工作为一体的网络管理系统。 技术细节&#xff1a; 体系结构…

什么是RPA机器人流程自动化软件?

泽众RPA机器人流程自动化软件&#xff0c;是一种能够模拟人类来执行重复性任务的软件&#xff1b;它通过驱动对于系统业务进行统筹安排、协调处理、自动执行以此提升业务处理效率。借助RPA用户可以提高工作效率、节省成本、降低出錯率、节省时间、并从重复性的后台任务中解放劳…

《学术小白学习之路12》进阶-基于Python实现中文文本的DTM主题动态模型构建

《学术小白学习之路》基于Python实现中文文本的DTM主题动态模型构建 一、数据选择二、数据预处理三、输入数据ID映射词典构建四、文档加载成构造语料库五、DTM模型构建与结果分析六、结果进行保存七、保存模型一、数据选择 所选取的数据集是论文摘要,作为实验数据集,共计12条…

中国人民大学与加拿大女王大学金融硕士为何占据在职读研人的心?一起来看看

说起北京地区的中外合作办学在职硕士项目哪个最受欢迎呢&#xff1f;无疑是中国人民大学与加拿大女王大学金融硕士项目&#xff0c;它已经深深占据在职读研人的心。项目历经十年的风雨&#xff0c;有口皆碑。一起去人大女王金融硕士项目为什么这么受青睐。 一、名校光环 女王金…

基于微信小程序的校园代送跑腿系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

Python和Scrapy构建可扩展的框架

构建一个可扩展的网络爬虫框架是利用Python和Scrapy实现高效数据采集的重要技能。在本文中&#xff0c;我将为您介绍如何使用Python和Scrapy搭建一个强大灵活的网络爬虫框架。我们将按照以下步骤展开&#xff1a; 1. 安装Scrapy&#xff1a; 首先&#xff0c;确保您已经安装了…

QT配置FFmpeg出现错误原因

文章目录 QT配置ffmpeg出现&#xff1a; undefined reference to "avcodec_version"没有配置环境变量QT和FFmpeg的版本不对应直接添加FFmpeg的头文件没有在.pro文件添加路径 QT 程序异常退出没有在debug文件里面存放dll库 QT配置ffmpeg出现&#xff1a; undefined re…

优思学院|怎样制定有效的质量管控措施?要善用六西格玛思维!

要看质量管控措施行不行&#xff0c;关键在于这些措施是不是经过认真分析才定的。分析要严谨&#xff0c;就可以用DMAIC这六个步骤&#xff0c;它是六西格玛方法的核心。DMAIC是六西格玛分析过程中的步骤&#xff0c;就是&#xff1a;定义&#xff08;Define&#xff09;、测量…

华为云云耀云服务器L实例使用教学|Unbelievable, 带你用云服务器部署Windows12

&#x1f4cb; 前言 &#x1f5b1; 博客主页&#xff1a;在下马农的碎碎念&#x1f917; 欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;✍ 本文由在下马农原创&#xff0c;首发于CSDN&#x1f4c6; 首发时间&#xff1a;2023/09/26&#x1f4c5; 最近更新时…

Bitcoin Consensus Mechanism——SYSU SSE Blockchain 5th lecture(English Version)

目录 Part 1: What is Consensus? Definition Distributed Consensus Consensus in Bitcoin CAP Theorem Definitions Trade-offs ("Pick Two" Dilemma) Part 2: Why Bitcoin needs Consensus Types of Consensus Mechanisms Why Bitcoin Needs Consensus…

LaTex排版系统:TeX Live+Visual Studio Code的配置

配置Tex排版系统需要安装编译器编辑器&#xff0c;编译器通常安装TeX Live&#xff0c;编辑器主要有TeXworks、TexStudio、WinEdt、Visual Studio Code等&#xff0c;目前VS Code普遍评价不错。下面介绍Windows平台安装LaTex的详细步骤。 1 安装TeX Live 1.1 下载地址选择国内…

babel的配置执行顺序

babel配置文件&#xff1a; //.babelrc {"presets": ["babel/preset-env","babel/preset-react"],"plugins": ["babel/plugin-proposal-class-properties",["babel/plugin-transform-runtime",{"corejs&quo…

R | R及Rstudio安装、运行环境变量及RStudio配置

R | R及Rstudio安装、运行环境变量及RStudio配置 一、介绍1.1 R介绍1.2 RStudio介绍 二、R安装2.1 演示电脑系统2.2 R下载2.3 R安装2.4 R语言运行环境设置&#xff08;环境变量&#xff09;2.4.1 目的2.4.2 R-CMD测试2.4.3 设置环境变量 2.5 R安装测试 三、RStudio安装3.1 RStu…

Windows下conda安装pytorch GPU版

1.安装miniconda,不细讲了,自己去百度,miniconda自带python,可以通过conda创建虚拟python环境,安装Pytorch的话建议python版本大于3.8,完成后注意配置环境变量。 2.安装CUDA: 查看自己CUDA版本,Nvidia控制面板中找,不再赘述。根据查看的版本,下载 CUDA Toolkit并安装…

ChatGPT重磅升级:可以看图、听声音、说话啦!

美东时间9月25日&#xff0c;OpenAI在官网宣布&#xff0c;对ChatGPT进行重磅升级实现看图、听声音、输出语音内容三大功能。 早在今年3月OpenAI发布GPT-4模型时&#xff0c;就展示过看图的功能&#xff0c;但由于安全、功能不完善等原因一直没有开放。现在不仅开放了看图&…

《玩转smardaten | 无代码开发移动端APP需要几步?最全操作!》

看完这么多免编程、无代码APP软件开发的文章&#xff0c;还是一脸茫然&#x1f62e;...只讲能开发出什么玩意&#xff0c;不讲到底怎么开发&#xff0c;我怎么学会&#xff1f; 来了&#xff0c;无代码的移动端操作教程&#xff0c;从PC移动端一体式开发&#xff0c;到移动端单…

python+nodejs+php+springboot+vue 导师双选系统

为了直观显示系统的功能&#xff0c;运用用例图这样的工具显示分析的结果。分析的导师功能如下。导师管理导师选择信息&#xff0c;管理项目&#xff0c;管理项目提交并对学员提交的项目进行指导。 为了直观显示系统的功能&#xff0c;运用用例图这样的工具显示分析的结果。分析…

Golang 函数 不定参数

不定参数 在C语言时代大家一般都用过printf()函数&#xff0c;从那个时候开始其实已经在感受不定参数的魅力和价值。如同C语言中的printf()函数&#xff0c;Go语言标准库中的fmt.Println()等函数的实现也严重依赖于语言的不定参数功能。 我们将介绍不定参数的用法。合适地使用…