03-02-架构篇-Editor打包系统架构

Editor 端系统架构

篇章:03-架构篇
阅读时间:约 40 分钟
前置知识:了解整体架构设计


一、引言

本章将深入解析 YooAsset 的 Editor 端系统架构。Editor 端是 YooAsset 的构建层,负责资源收集、依赖分析、资源打包和清单生成等核心功能。理解 Editor 端架构是掌握 YooAsset 构建流程的关键。

YooAsset 的 Editor 端采用了 Collector → BuildMap → Builder → Manifest 的流水线设计,每个环节职责清晰,相互协作。本章将详细解析每个环节的设计和实现。


二、AssetBundleCollector 架构

2.1 Collector 的概念

AssetBundleCollector 是 YooAsset 的资源收集器,负责根据用户的配置收集需要打包的资源。它是整个构建流程的起点,决定了哪些资源会被纳入构建流程。

Collector 的定义:

Collector 是一个抽象类,定义了资源收集的基本接口。具体的收集器继承自 Collector,实现具体的收集逻辑。

Collector 的作用:

  • 资源收集:扫描指定路径,根据过滤规则收集需要打包的资源
  • 资源分类:根据 Collector 类型对资源进行分类(主资源、静态资源、依赖资源)
  • 寻址配置:配置资源的寻址方式(String Address、GUID Address、Label Address)
  • 打包配置:配置资源的打包规则(Pack Rule)和过滤规则(Filter Rule)

Collector 的属性:

public abstract class Collector
{
    public string CollectPath;          // 收集路径
    public string CollectorName;       // 收集器名称
    public ECollectorType CollectorType; // 收集器类型
    public IPackRule PackRule;         // 打包规则
    public IFilterRule FilterRule;     // 过滤规则
    public EAddressRule AddressRule;   // 寻址规则
    public List<string> AssetTags;     // 资源标签
    public string UserData;            // 用户自定义数据
}

2.2 Package、Group、Collector 层级

YooAsset 采用 Package → Group → Collector 的三级层级结构:

Package / Group / Collector 层级结构
├── Package(资源包)
│   ├── PackageName:包名
│   ├── PackageVersion:版本
│   ├── PackageManifest:清单
│   └── Group 列表
├── Group(分组)
│   ├── GroupName:分组名
│   ├── GroupDesc:分组描述
│   ├── PackRule:打包规则
│   └── Collector 列表
└── Collector(收集器)
    ├── CollectPath:收集路径
    ├── CollectorType:收集器类型
    ├── PackRule:打包规则
    └── FilterRule:过滤规则

Package 详解:

Package 是 YooAsset 资源管理的最高层级,代表一个完整的资源包。每个 Package 有自己的名称、版本和清单(Manifest),可以独立打包、更新和加载。

Package 的特点:

  • 独立性:每个 Package 独立管理自己的资源
  • 可配置性:Package 的配置可以独立修改
  • 可热更性:Package 可以独立进行热更新

Group 详解:

Group 是 Package 下的分组,将相关的 Collector 组织在一起。Group 用于对资源进行逻辑分组,便于管理。

Group 的特点:

  • 逻辑分组:将相关的资源收集器组织在一起
  • 统一打包:Group 内的资源可以统一打包
  • 依赖管理:Group 之间的依赖关系便于管理

Collector 详解:

Collector 是最细粒度的资源收集器,定义了具体的资源收集路径和规则。每个 Collector 对应一个或多个资源的收集。

层级关系:

一个 Package 可以包含多个 Group,一个 Group 可以包含多个 Collector。这种三级层级结构提供了灵活的资源组织方式。

2.3 Collector 的工作原理

Collector 的工作流程如下:

  1. 路径指定:指定需要收集的资源路径(文件夹或单个文件)
  2. 资源扫描:扫描指定路径下的所有资源
  3. 过滤处理:根据过滤规则排除不需要的资源
  4. 规则应用:根据打包规则和寻址规则处理资源
  5. 结果输出:输出收集到的资源列表

路径指定详解:

CollectPath 是 Collector 的资源收集路径,可以是文件夹路径或单个文件路径。例如 Assets/UI、Assets/Characters/Hero.prefab。

资源扫描详解:

资源扫描会递归扫描 CollectPath 下的所有资源,包括子目录中的资源。扫描会识别资源的类型、依赖关系等信息。

过滤处理详解:

过滤处理根据 FilterRule 排除不需要的资源。常见的过滤规则包括按路径过滤、按类型过滤、按标签过滤等。

规则应用详解:

规则应用根据 PackRule 和 AddressRule 处理资源。PackRule 决定资源的打包方式,AddressRule 决定资源的寻址方式。

结果输出详解:

Collector 最终输出一个资源列表,包括每个资源的路径、类型、依赖关系、Bundle 分配等信息。

2.4 Collector 的寻址模式

YooAsset 支持三种寻址模式:

寻址模式 描述 优点 缺点
String Address 通过字符串地址寻址,如 "ui/login" 易读、易记 可能冲突
GUID Address 通过资源 GUID 寻址 唯一、不冲突 不可读
Label Address 通过标签寻址 批量访问 需要额外配置

String Address 详解:

String Address 是最常用的寻址模式,通过资源的相对路径或自定义字符串作为地址。例如 ui/login、characters/hero。

GUID Address 详解:

GUID Address 通过资源的 GUID 作为地址。GUID 是 Unity 为每个资源生成的唯一标识符,使用 GUID 作为地址可以避免地址冲突。

Label Address 详解:

Label Address 通过标签(Tag)寻址。开发者可以为资源打标签,然后通过标签批量访问资源。例如 ui、character。

混合寻址详解:

YooAsset 支持混合寻址模式,可以同时使用多种寻址方式。开发者可以根据需要灵活选择寻址方式。


三、BuildMap 架构

3.1 BuildMap 的概念

BuildMap 是 YooAsset 的构建映射,记录了资源到 Bundle 的映射关系以及 Bundle 之间的依赖关系。它是资源打包的蓝图。

BuildMap 的定义:

BuildMap 是一个数据结构,包含了所有 Bundle 的信息、每个 Bundle 包含的资源、Bundle 之间的依赖关系等。

BuildMap 的作用:

  • 打包依据:BuildMap 是资源打包的依据,Builder 根据 BuildMap 执行打包
  • 依赖管理:BuildMap 记录了 Bundle 之间的依赖关系
  • 优化建议:BuildMap 可以检测资源冗余、循环依赖等问题

BuildMap 的生成:

BuildMap 是由 Collector 输出的结果经过分析处理后生成的。它整合了所有 Collector 的收集结果,并进行了依赖分析。

3.2 BuildMap 的工作流程

BuildMap 的工作流程如下:

  1. 收集所有 Collector 输出:从所有 Collector 收集资源信息
  2. 分析资源到 Bundle 的分配:根据 Pack Rule 决定每个资源属于哪个 Bundle
  3. 分析资源依赖关系:分析资源之间的依赖关系
  4. 提取共享资源:识别被多个 Bundle 共享的资源
  5. 检测循环依赖:检测依赖图中是否存在循环依赖
  6. 生成最终 BuildMap:整合所有信息生成最终的 BuildMap

3.3 BuildMap 的数据结构

BuildMap 包含以下数据结构:

BuildMap 数据结构
├── Bundle 列表
│   ├── Bundle 名称
│   ├── Bundle 包含的资源
│   └── Bundle 依赖的其他 Bundle
├── 资源映射
│   ├── 资源地址
│   ├── 资源类型
│   └── 资源所属 Bundle
└── 依赖图
    ├── 节点:Bundle 和资源
    └── 边:依赖关系

Bundle 列表详解:

Bundle 列表记录了所有 Bundle 的信息,包括每个 Bundle 的名称、包含的资源、依赖的其他 Bundle 等。

资源映射详解:

资源映射记录了资源到 Bundle 的映射关系。通过资源映射,可以快速找到某个资源属于哪个 Bundle。

依赖图详解:

依赖图记录了 Bundle 之间和资源之间的依赖关系。通过依赖图,可以分析资源的依赖关系,检测循环依赖。

3.4 BuildMap 的错误检测

BuildMap 可以检测以下类型的错误:

冗余检测:

冗余检测会检测是否存在重复打包的资源。如果一个资源被多个 Bundle 包含,BuildMap 会发出警告。

依赖警报:

依赖警报会检测资源之间的依赖关系是否合理。如果存在异常的依赖关系,BuildMap 会发出警告。

优化建议:

BuildMap 可以根据分析结果给出优化建议,例如建议将某些资源合并打包、建议拆分过大的 Bundle 等。


四、Builder 架构

4.1 Builder 的概念

Builder 是 YooAsset 的构建器,负责执行实际的打包操作。它是 BuildMap 和 AssetBundle 之间的桥梁。

Builder 的定义:

Builder 是一个抽象类,定义了构建的基本接口。具体的构建器继承自 Builder,实现具体的构建逻辑。

Builder 的作用:

  • 执行打包:根据 BuildMap 执行实际的 AssetBundle 打包操作
  • 支持多种管线:支持内置构建管线和 SBP 构建管线
  • 生成构建报告:生成详细的构建报告

Builder 的属性:

public abstract class Builder
{
    public BuildParameters BuildParameters;  // 构建参数
    public IBuildPipeline BuildPipeline;     // 构建管线
    public BuildReport Report;               // 构建报告
}

4.2 内置构建管线

YooAsset 的内置构建管线是基于 Unity 内置的 AssetBundle 构建 API 实现的。

内置构建管线的定义:

内置构建管线是 YooAsset 默认提供的构建管线,使用 Unity 内置的 AssetBundle 构建 API。

内置构建管线的流程:

  1. 获取 BuildMap
  2. 调用 Unity 内置的 AssetBundle 构建 API
  3. 生成 AssetBundle 文件
  4. 生成构建报告

内置构建管线的优点:

  • 简单:使用 Unity 内置 API,实现简单
  • 稳定:经过 Unity 官方验证,稳定性高
  • 兼容性好:兼容所有 Unity 支持的平台

内置构建管线的缺点:

  • 性能有限:不支持并行构建,构建速度有限
  • 自定义能力有限:受限于 Unity 内置 API 的能力

4.3 SBP 构建管线

SBP(Scriptable Build Pipeline)是 Unity 提供的高级构建管线。

SBP 构建管线的定义:

SBP 构建管线是基于 Unity 的 Scriptable Build Pipeline 实现的,提供了更强大的构建能力。

SBP 构建管线的流程:

  1. 获取 BuildMap
  2. 调用 SBP API 执行构建
  3. 生成 AssetBundle 文件
  4. 生成构建报告

SBP 构建管线的优点:

  • 性能强:支持并行构建,构建速度快
  • 自定义能力强:支持自定义构建任务
  • 支持增量构建:原生支持增量构建

SBP 构建管线的缺点:

  • 需要安装 SBP 包:需要单独安装 Scriptable Build Pipeline 包
  • 配置复杂:配置相对复杂

4.4 任务系统设计

YooAsset 的构建采用了任务系统设计:

任务系统设计
├── 任务节点:构建流程中的每个操作是一个任务节点
├── 任务依赖:任务节点之间可以定义依赖关系
├── 任务执行:根据依赖关系执行任务
└── 任务回调:任务完成后的回调通知

任务节点详解:

任务节点是构建流程中的基本单位,每个任务节点代表一个具体的操作,如"收集资源"、"分析依赖"、"打包资源"等。

任务依赖详解:

任务节点之间可以定义依赖关系,例如"打包资源"任务依赖于"收集资源"和"分析依赖"任务。

任务执行详解:

任务执行器会根据任务依赖关系,按照正确的顺序执行任务。支持并行执行独立的任务。

任务回调详解:

任务完成后会触发回调通知,可以用于更新进度、显示日志等。


五、增量构建

5.1 增量构建的概念

增量构建是只重新打包发生变化的资源,而不是重新打包所有资源。

增量构建的定义:

增量构建是指在上一次构建的基础上,只重新打包发生变化的资源,未变化的资源直接复用上一次的构建结果。

增量构建的优势:

  • 大幅减少构建时间:只需处理变化的资源
  • 减少资源冗余:未变化的资源直接复用
  • 提高开发效率:开发者可以更快地完成构建

增量构建的前提:

增量构建的前提是能够准确检测资源的变化。YooAsset 通过对比前后两次构建的 BuildMap 来检测资源变化。

5.2 增量构建的实现

增量构建的实现步骤如下:

  1. 对比当前 BuildMap 和上次 BuildMap
  2. 找出变化的 Bundle
  3. 只重新打包变化的 Bundle
  4. 复用未变化的 Bundle,不重新构建
  5. 生成新的 Manifest

BuildMap 对比详解:

BuildMap 对比是增量构建的核心。通过对比两个 BuildMap,可以准确识别变化的 Bundle 和未变化的 Bundle。

变化检测详解:

变化检测会检查每个 Bundle 的内容是否发生变化。如果 Bundle 内的资源发生变化,或者 Bundle 的依赖关系发生变化,则认为该 Bundle 发生了变化。

复用策略详解:

未变化的 Bundle 会被直接复用,不会重新构建。这可以显著减少构建时间和构建产物的大小。

5.3 增量构建的局限性

增量构建存在以下局限性:

资源类型变化:

当资源类型发生变化时(如从 Texture 改为 Sprite),需要重新打包。

依赖关系变化:

当资源的依赖关系发生变化时,需要重新打包相关的 Bundle。

配置变化:

当构建配置发生变化时(如压缩算法、加密方式),需要重新打包。


六、构建配置

6.1 压缩配置

YooAsset 支持多种压缩算法:

压缩配置
├── 压缩算法选择:LZMA、LZ4、不压缩
├── 压缩权衡:压缩率 vs 压缩/解压速度
└── 多 Bundle 配置:不同 Bundle 使用不同压缩方式

压缩算法选择:

YooAsset 支持 LZMA、LZ4、不压缩三种压缩方式。LZMA 压缩率高但解压慢,适合网络传输;LZ4 压缩率适中但解压快,适合运行时加载;不压缩最快但体积大,适合首包资源。

压缩权衡:

压缩需要在压缩率、压缩速度、解压速度之间权衡。开发者需要根据项目需求选择合适的压缩方式。

多 Bundle 配置:

YooAsset 支持为不同的 Bundle 配置不同的压缩方式,可以根据 Bundle 的特点选择合适的压缩方式。

6.2 加密配置

YooAsset 支持多种加密方式:

加密配置
├── 加密算法选择:AES、XOR
├── 加密粒度:整体 Bundle 加密 vs 单个资源加密
└── 加密密钥:管理加密密钥的存储位置

加密算法选择:

YooAsset 支持 AES 和 XOR 两种加密算法。AES 安全性高但性能开销大,XOR 性能好但安全性低。

加密粒度:

加密粒度可以是整体 Bundle 加密或单个资源加密。整体 Bundle 加密实现简单,单个资源加密更灵活。

加密密钥:

加密密钥需要妥善管理。YooAsset 支持通过 IDecryptionServices 接口自定义密钥管理方式。

6.3 平台配置

YooAsset 支持多平台构建:

平台配置
├── 目标平台选择:iOS、Android、Windows、WebGL 等
├── 平台特定配置:不同平台的优化设置
└── 多平台构建:一次构建多平台

目标平台选择:

YooAsset 支持 iOS、Android、Windows、WebGL 等所有 Unity 支持的平台。开发者可以根据需要选择目标平台。

平台特定配置:

不同平台可能有不同的优化设置。例如,移动端通常需要更小的资源体积,PC 端可以接受更大的资源体积。

多平台构建:

YooAsset 支持一次构建多平台,可以同时为多个平台生成构建产物。


七、总结

本章深入解析了 YooAsset Editor 端的系统架构,包括:

  • AssetBundleCollector:资源收集器,负责资源的收集和分类
  • BuildMap:构建映射,记录资源到 Bundle 的映射关系
  • Builder:构建器,执行实际的打包操作
  • 增量构建:只重新打包变化的资源,提高构建效率
  • 构建配置:压缩、加密、平台等配置

理解 Editor 端架构是掌握 YooAsset 构建流程的关键。通过灵活运用这些架构设计,可以实现高效、灵活的资源打包。


上一篇:整体架构设计
下一篇:Runtime 端系统架构

posted @ 2026-09-25 20:08  SmalBox  阅读(4)  评论(0)    收藏  举报