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 中的资源
  • 资源管理:管理已加载资源的生命周期
  • 引用计数:使用引用计数管理资源的引用关系
  • 缓存管理:管理内存缓存和磁盘缓存
  • 热更新:支持资源热更新和版本管理

分层架构的好处:

  1. 职责分离:构建逻辑和运行逻辑分离,各自专注于自己的领域
  2. 独立测试:可以独立测试 Editor 层和 Runtime 层
  3. 性能优化:Runtime 层可以针对运行时进行优化,减少不必要的代码
  4. 包体减小:Editor 层的代码不会包含在最终安装包中,减小包体
  5. 维护性强:修改构建逻辑不会影响运行时的稳定性

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 层的模块按以下流程协作:

  1. AssetBundleCollector 收集资源:根据用户的 Collector 配置,扫描指定路径,收集需要打包的资源
  2. BuildMap 构建依赖图:分析资源之间的依赖关系,构建依赖图,分配 Bundle
  3. AssetBundleBuilder 执行打包:根据 BuildMap 执行实际的 AssetBundle 打包操作
  4. TaskCreateManifest 生成清单:将构建结果生成 PackageManifest 文件

3.3 Runtime 层模块协作

Runtime 层的模块按以下流程协作:

  1. YooAssets 初始化:创建 YooAssets 实例,初始化全局环境
  2. ResourcePackage 初始化:创建 ResourcePackage,加载 Manifest 文件
  3. ResourceManager 初始化:初始化资源管理器,准备资源加载
  4. 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 文件通信

分层架构的优势:

  1. 清晰的职责划分:每个层都有明确的职责,便于理解和维护
  2. 独立的测试和优化:可以独立测试和优化每个层
  3. 灵活的扩展:可以在每个层独立扩展功能

5.3 可扩展性

YooAsset 的设计遵循可扩展性原则:

  • 接口抽象:通过 IFileSystem、IDecryptionServices 等接口抽象关键功能
  • 子类扩展:通过继承 AsyncOperationBase、ResourceProvider 等基类扩展功能
  • 插件化架构:YooAsset 的核心架构是插件化的,支持自定义扩展

可扩展性的应用:

  1. 自定义文件系统:开发者可以实现 IFileSystem 接口来创建自定义的文件系统
  2. 自定义解密服务:开发者可以实现 IDecryptionServices 接口来创建自定义的解密服务
  3. 自定义资源提供者:开发者可以继承 ResourceProvider 来创建自定义的资源提供者

5.4 高性能

YooAsset 的设计遵循高性能原则:

  • 异步操作:所有加载操作都是异步的,避免阻塞主线程
  • 引用计数:使用引用计数管理资源生命周期,避免内存泄漏
  • 对象池:使用对象池减少 GC 压力
  • 缓存机制:使用多级缓存提高加载速度

高性能的实现:

  1. 异步加载:通过 OperationSystem 实现异步加载,避免阻塞主线程
  2. 引用计数:通过 ResourceManager 实现引用计数管理,确保资源正确释放
  3. 缓存优化:通过多级缓存机制提高资源加载速度

六、架构演进

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 端系统架构

posted @ 2026-09-24 15:32  SmalBox  阅读(6)  评论(0)    收藏  举报