03-01-架构篇-整体架构总览
整体架构设计
篇章:03-架构篇
阅读时间:约 40 分钟
前置知识:了解 YooAsset 基础概念
一、引言
本章将深入解析 YooAsset 的整体架构设计,从全局视角理解 YooAsset 是如何组织代码、如何划分模块、如何协调各个子系统工作的。理解整体架构是深入学习 YooAsset 各模块的基础。
YooAsset 是一个功能强大且架构清晰的资源管理框架。它通过精心设计的模块划分、清晰的接口定义和灵活的配置系统,为 Unity 开发者提供了完整的资源管理解决方案。本章将从架构层面全面解析 YooAsset 的设计思想。
二、双层系统架构
2.1 Editor 层与 Runtime 层的分离
YooAsset 采用 Editor 层和 Runtime 层分离的架构设计,这是其最重要的架构特征之一。
Editor 层详解:
Editor 层是 YooAsset 的构建层,运行在 Unity 编辑器中。它负责资源的收集、分析、打包和清单生成。Editor 层只在编辑时运行,不会包含在最终的游戏安装包中。
Editor 层的主要职责包括:
- 资源收集:根据 Collector 配置收集需要打包的资源
- 依赖分析:分析资源之间的依赖关系,构建依赖图
- 资源打包:执行实际的 AssetBundle 打包操作
- 清单生成:生成资源清单(Manifest)文件
- 构建报告:生成构建报告,帮助开发者分析构建结果
Runtime 层详解:
Runtime 层是 YooAsset 的运行层,在游戏运行时工作。它负责资源的加载、管理、缓存和卸载。Runtime 层会被编译到游戏安装包中,是玩家实际使用的部分。
Runtime 层的主要职责包括:
- 资源加载:根据资源地址加载 AssetBundle 中的资源
- 资源管理:管理已加载资源的生命周期
- 引用计数:使用引用计数管理资源的引用关系
- 缓存管理:管理内存缓存和磁盘缓存
- 热更新:支持资源热更新和版本管理
分层架构的好处:
- 职责分离:构建逻辑和运行逻辑分离,各自专注于自己的领域
- 独立测试:可以独立测试 Editor 层和 Runtime 层
- 性能优化:Runtime 层可以针对运行时进行优化,减少不必要的代码
- 包体减小:Editor 层的代码不会包含在最终安装包中,减小包体
- 维护性强:修改构建逻辑不会影响运行时的稳定性
2.2 Editor 层核心模块
YooAsset 的 Editor 层由以下核心模块组成:
Editor 层模块架构
├── AssetBundleCollector(资源收集器)
│ ├── MainAssetCollector:主资源收集器
│ ├── StaticAssetCollector:静态资源收集器
│ └── DependAssetCollector:依赖资源收集器
├── BuildMap(构建映射)
│ ├── 资源依赖图
│ ├── Bundle 分配方案
│ └── 循环依赖检测
├── AssetBundleBuilder(构建器)
│ ├── BuiltinBuildPipeline(内置构建管线)
│ ├── ScriptableBuildPipeline(SBP 构建管线)
│ └── EditorSimulateBuildPipeline(编辑器模拟管线)
├── TaskCreateManifest(清单创建任务)
│ ├── PackageManifest 生成
│ └── 资源清单写入
└── ReportBuilder(报告生成器)
├── 构建报告
└── 依赖分析报告
AssetBundleCollector 详解:
AssetBundleCollector 是资源收集器,负责根据用户的配置收集需要打包的资源。它是整个构建流程的起点,决定了哪些资源会被纳入构建流程。
BuildMap 详解:
BuildMap 是构建映射,记录了资源到 Bundle 的映射关系以及 Bundle 之间的依赖关系。它是资源打包的蓝图。
AssetBundleBuilder 详解:
AssetBundleBuilder 是构建器,负责执行实际的打包操作。它支持多种构建管线,可以根据项目需求选择合适的构建方式。
TaskCreateManifest 详解:
TaskCreateManifest 是清单创建任务,负责生成 PackageManifest 文件。PackageManifest 包含了所有 Bundle 的信息,是 Runtime 层加载资源的依据。
2.3 Runtime 层核心模块
YooAsset 的 Runtime 层由以下核心模块组成:
Runtime 层模块架构
├── YooAssets(全局静态入口)
│ ├── Package 管理
│ └── 初始化流程
├── ResourcePackage(资源包)
│ ├── 资源加载入口
│ └── 资源生命周期管理
├── ResourceManager(资源管理器)
│ ├── Provider 管理
│ ├── 引用计数管理
│ └── 缓存管理
├── Provider(资源提供者)
│ ├── AssetProvider
│ ├── SceneProvider
│ └── ComponentProvider
├── FileSystem(文件系统)
│ ├── IFileSystem 接口
│ └── 内置文件系统实现
├── OperationSystem(异步操作系统)
│ ├── 异步操作调度
│ └── 时间片管理
└── Operation(异步操作)
├── AsyncOperationBase
└── 具体操作实现
YooAssets 详解:
YooAssets 是 YooAsset 的全局静态入口,提供了统一的 API 让开发者与 YooAsset 进行交互。它内部委托给各个 ResourcePackage 对象。
ResourcePackage 详解:
ResourcePackage 是资源包,封装了一组相关资源的加载、卸载和管理。每个 ResourcePackage 都有自己的 Manifest、文件系统和资源管理器。
ResourceManager 详解:
ResourceManager 是资源管理器,负责资源加载、缓存、引用计数等核心功能。它是 Runtime 层的核心模块。
Provider 详解:
Provider 是资源提供者,封装了资源加载的具体逻辑。不同类型的资源有不同的 Provider 实现。
FileSystem 详解:
FileSystem 是文件系统抽象,负责跨平台的文件访问。它提供了统一的接口,屏蔽了不同平台的差异。
OperationSystem 详解:
OperationSystem 是异步操作系统,负责异步操作的调度和管理。它支持优先级调度、时间片管理等高级特性。
三、核心模块协作关系
3.1 模块协作总览
YooAsset 的各个模块不是独立工作的,它们相互协作完成资源管理的全流程。
YooAsset 模块协作总览
├── 构建阶段(Editor)
│ ├── AssetBundleCollector → 收集资源
│ ├── BuildMap → 构建依赖图
│ ├── AssetBundleBuilder → 执行打包
│ └── TaskCreateManifest → 生成清单
├── 数据流转
│ ├── Editor 生成 Manifest 文件
│ └── Runtime 读取 Manifest 文件
└── 运行阶段(Runtime)
├── YooAssets → 全局入口
├── ResourcePackage → 资源包
├── ResourceManager → 资源管理
└── Provider → 资源加载
构建阶段详解:
构建阶段是 YooAsset 的 Editor 层执行的阶段,包括资源收集、依赖分析、资源打包和清单生成等步骤。
数据流转详解:
数据流转是 Editor 层和 Runtime 层之间的桥梁。Editor 层生成的 Manifest 文件会被 Runtime 层读取,作为资源加载的依据。
运行阶段详解:
运行阶段是 YooAsset 的 Runtime 层执行的阶段,包括资源加载、缓存管理、引用计数等步骤。
3.2 Editor 层模块协作
Editor 层的模块按以下流程协作:
- AssetBundleCollector 收集资源:根据用户的 Collector 配置,扫描指定路径,收集需要打包的资源
- BuildMap 构建依赖图:分析资源之间的依赖关系,构建依赖图,分配 Bundle
- AssetBundleBuilder 执行打包:根据 BuildMap 执行实际的 AssetBundle 打包操作
- TaskCreateManifest 生成清单:将构建结果生成 PackageManifest 文件
3.3 Runtime 层模块协作
Runtime 层的模块按以下流程协作:
- YooAssets 初始化:创建 YooAssets 实例,初始化全局环境
- ResourcePackage 初始化:创建 ResourcePackage,加载 Manifest 文件
- ResourceManager 初始化:初始化资源管理器,准备资源加载
- Provider 执行加载:根据请求创建对应的 Provider,执行资源加载
四、核心数据流
4.1 构建数据流
构建数据流描述了资源从收集到打包的完整过程:
构建数据流
资源 → Collector 收集 → BuildMap 构建 → Builder 打包 → Manifest 输出
资源收集阶段:
在资源收集阶段,AssetBundleCollector 扫描用户配置的路径,根据过滤规则收集需要打包的资源。
依赖分析阶段:
在依赖分析阶段,BuildMap 分析资源之间的依赖关系,构建依赖图,并检测循环依赖。
资源打包阶段:
在资源打包阶段,AssetBundleBuilder 根据 BuildMap 执行实际的 AssetBundle 打包操作,生成 Bundle 文件。
清单生成阶段:
在清单生成阶段,TaskCreateManifest 将构建结果生成 PackageManifest 文件,包括所有 Bundle 的信息、依赖关系等。
4.2 加载数据流
加载数据流描述了从资源地址到资源对象的完整过程:
加载数据流
Address → YooAssets 解析 → ResourcePackage 处理 → ResourceManager 处理 → Provider 处理 → 资源返回
地址解析阶段:
在地址解析阶段,YooAssets 接收用户的资源地址请求,并将其转发到对应的 ResourcePackage。
资源包处理阶段:
在资源包处理阶段,ResourcePackage 接收资源地址请求,并查询 Manifest 文件找到对应的 Bundle。
资源管理器处理阶段:
在资源管理器处理阶段,ResourceManager 根据资源地址和 Bundle 信息,创建对应的 Provider。
资源提供者处理阶段:
在资源提供者处理阶段,Provider 执行实际的资源加载操作,从 FileSystem 读取数据并加载资源。
资源返回阶段:
在资源返回阶段,资源对象被返回给调用者,调用者可以使用该资源对象。
4.3 热更新数据流
热更新数据流描述了从版本检查到资源加载的完整过程:
热更新数据流
启动 → 请求 Manifest → 版本对比 → 下载补丁 → 安装资源 → 切换版本
版本检查阶段:
在版本检查阶段,客户端向服务器请求最新的 Manifest 文件,并与本地 Manifest 进行对比。
差异下载阶段:
在差异下载阶段,客户端根据 Manifest 的差异信息,从服务器下载需要更新的资源。
资源安装阶段:
在资源安装阶段,客户端将下载的资源安装到本地,并更新本地的版本信息。
版本切换阶段:
在版本切换阶段,客户端使用最新版本加载资源,完成热更新。
4.4 数据流的关键节点
YooAsset 数据流中有三个关键节点:
Manifest 节点:
Manifest 是 Editor 层和 Runtime 层之间的桥梁。它记录了所有 Bundle 的信息,是 Runtime 层加载资源的依据。
Address 节点:
Address 是 Runtime 层资源定位的核心。通过 Address,开发者可以加载任何资源,而不需要关心资源的位置。
Operation 节点:
Operation 是异步操作的核心抽象。所有异步操作都通过 Operation 进行管理,支持进度查询、回调通知等功能。
五、架构设计原则
5.1 非侵入性
YooAsset 的设计遵循非侵入性原则:
- 不修改 Unity 源码:YooAsset 通过扩展和包装的方式实现功能,不修改 Unity 的源码
- 不改变项目结构:YooAsset 可以无缝集成到现有项目中,不需要改变项目结构
- 即插即用:YooAsset 可以方便地集成和移除
非侵入性的实现方式:
YooAsset 通过定义清晰的接口(如 IFileSystem、IDecryptionServices 等)实现非侵入性。开发者可以实现这些接口来扩展功能,而不需要修改 YooAsset 的源码。
5.2 分层架构
YooAsset 的设计遵循分层架构原则:
- Editor 层和 Runtime 层分离:构建逻辑和运行逻辑分离
- 模块职责清晰:每个模块都有明确的职责,互不干扰
- 通过 Manifest 通信:Editor 层和 Runtime 层通过 Manifest 文件通信
分层架构的优势:
- 清晰的职责划分:每个层都有明确的职责,便于理解和维护
- 独立的测试和优化:可以独立测试和优化每个层
- 灵活的扩展:可以在每个层独立扩展功能
5.3 可扩展性
YooAsset 的设计遵循可扩展性原则:
- 接口抽象:通过 IFileSystem、IDecryptionServices 等接口抽象关键功能
- 子类扩展:通过继承 AsyncOperationBase、ResourceProvider 等基类扩展功能
- 插件化架构:YooAsset 的核心架构是插件化的,支持自定义扩展
可扩展性的应用:
- 自定义文件系统:开发者可以实现 IFileSystem 接口来创建自定义的文件系统
- 自定义解密服务:开发者可以实现 IDecryptionServices 接口来创建自定义的解密服务
- 自定义资源提供者:开发者可以继承 ResourceProvider 来创建自定义的资源提供者
5.4 高性能
YooAsset 的设计遵循高性能原则:
- 异步操作:所有加载操作都是异步的,避免阻塞主线程
- 引用计数:使用引用计数管理资源生命周期,避免内存泄漏
- 对象池:使用对象池减少 GC 压力
- 缓存机制:使用多级缓存提高加载速度
高性能的实现:
- 异步加载:通过 OperationSystem 实现异步加载,避免阻塞主线程
- 引用计数:通过 ResourceManager 实现引用计数管理,确保资源正确释放
- 缓存优化:通过多级缓存机制提高资源加载速度
六、架构演进
6.1 v1.x 架构
YooAsset v1.x 是初版架构,采用了简单的 AssetBundle 封装:
- 简单的 AB 包封装:直接在 AssetBundle 之上进行了简单封装
- 基础的功能支持:支持资源加载和热更新
- 有限的扩展能力:扩展能力有限
v1.x 架构的特点:
v1.x 架构简单易用,但功能有限,扩展能力不足。它主要解决了资源加载和热更新的基本问题,但缺少高级功能。
6.2 v2.x 架构
YooAsset v2.x 引入了 Package/Group/Collector 概念,大幅提升了扩展能力:
- Package/Group/Collector 三级架构:清晰的三级架构,便于管理
- 完善的热更新支持:支持更完善的热更新机制
- IFileSystem 抽象层:引入 IFileSystem 抽象层,支持跨平台
v2.x 架构的特点:
v2.x 架构在 v1.x 的基础上引入了 Package/Group/Collector 概念,使资源管理更加清晰和灵活。同时引入了 IFileSystem 抽象层,支持跨平台文件访问。
6.3 v3.x 架构
YooAsset v3.x 引入了 OperationSystem,是一次重大升级:
- OperationSystem 异步体系:统一的异步操作管理
- 完善的小游戏支持:增加了对小游戏平台的支持
- 增强的调试功能:提供了更强大的调试工具
v3.x 架构的特点:
v3.x 架构在 v2.x 的基础上引入了 OperationSystem,实现了统一的异步操作管理。这大大提高了资源加载的效率和可控性。
6.4 未来演进方向
YooAsset 未来可能的演进方向:
- AI 智能资源管理:利用 AI 技术进行智能资源管理和优化
- 更智能的缓存策略:基于机器学习优化缓存策略
- 云原生的监控工具:提供云原生的监控工具
未来演进的可能性:
随着技术的发展,YooAsset 可能会集成更多先进技术,如 AI、云原生等,为开发者提供更智能、更高效的资源管理解决方案。
七、总结
本章从架构层面全面解析了 YooAsset 的设计思想,包括:
- 双层系统架构:Editor 层负责构建,Runtime 层负责运行
- 模块协作关系:各个模块协同工作,完成资源管理全流程
- 核心数据流:构建数据流、加载数据流、热更新数据流
- 架构设计原则:非侵入性、分层架构、可扩展性、高性能
- 架构演进:从 v1.x 到 v3.x 的演进历程
理解 YooAsset 的整体架构是深入学习各模块的基础。接下来的章节将分别深入解析 YooAsset 的各个核心模块。
上一篇:异步加载与时间片
下一篇:Editor 端系统架构
下一篇:Editor 端系统架构

本章将深入解析 YooAsset 的整体架构设计,从全局视角理解 YooAsset 是如何组织代码、如何划分模块、如何协调各个子系统工作的。理解整体架构是深入学习 YooAsset 各模块的基础。
浙公网安备 33010602011771号