---
title: "07-03-打包系统-资源变体与多平台适配 - Angryecho"
description: "核心技术-资源组织与依赖 篇章：07-核心技术-资源打包系统 阅读时间：约 25 分钟 前置知识：了解打包策略 一、引言 本章将深入解析 YooAsset 资源组织与依赖管理。合理的资源组织可以提高打包效率、减小包体大小、加快加载速度。依赖管理是资源组织的核心，深入理解依赖管理有助于避免循环依赖、减少冗余打包。"
canonical_url: "https://www.angryecho.com/c/qian_duan_she_qu/p/P2TBC0j1YSclLwFP4dRa9"
meta:
  "og:description": "核心技术-资源组织与依赖 篇章：07-核心技术-资源打包系统 阅读时间：约 25 分钟 前置知识：了解打包策略 一、引言 本章将深入解析 YooAsset 资源组织与依赖管理。合理的资源组织可以提高打包效率、减小包体大小、加快加载速度。依赖管理是资源组织的核心，深入理解依赖管理有助于避免循环依赖、减少冗余打包。"
  "og:image": "https://www.angryecho.com/_og/d/c_Post%2Ctitle_~5ZCQ5qe9572R%2Cdescription_~5ZCQ5qe95LiA5LiL77yM5bCx5LiK5ZCQ5qe9572R44CC%2CpostId_P2TBC0j1YSclLwFP4dRa9%2Crevision_~MjAyNi0xMS0wMlQwMjo1NTo1Ni44NjcxNzBa%2Cp_Ii9jL3FpYW5fZHVhbl9zaGVfcXUvcC9QMlRCQzBqMVlTY2xMd0ZQNGRSYTki%2Cs_2EGg3GegU-T88rQl.png"
  "og:image:height": "630"
  "og:image:type": image/png
  "og:image:width": "1200"
  "og:title": "07-03-打包系统-资源变体与多平台适配"
---

> Index of every page on this site: [llms.txt](https://www.angryecho.com/llms.txt)

# **07-03-打包系统-资源变体与多平台适配**

## 核心技术-资源组织与依赖

> **篇章**：07-核心技术-资源打包系统 **阅读时间**：约 25 分钟 **前置知识**：了解打包策略

---

### 一、引言

本章将深入解析 YooAsset 资源组织与依赖管理。合理的资源组织可以提高打包效率、减小包体大小、加快加载速度。依赖管理是资源组织的核心，深入理解依赖管理有助于避免循环依赖、减少冗余打包。

YooAsset 提供了多种资源组织方式和强大的依赖分析能力。本章将详细解析资源组织和依赖管理的最佳实践。

---

### 二、资源分组策略

#### 2.1 分组原则

合理的资源分组是打包策略的基础：

**按功能分组**：

将同一功能的资源放在同一目录或 Collector 下。

```
// UI 模块
var uiCollector = new AssetBundleCollector
{
    CollectPath = "Assets/UI",
    GroupName = "UI",
};

// 角色模块
var characterCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Characters",
    GroupName = "Characters",
};
```

**按加载时机分组**：

将同一加载时机的资源放在同一 Collector。

**按更新频率分组**：

将不同更新频率的资源放在不同 Collector。

#### 2.2 分组粒度

分组粒度需要权衡：

**过粗的分组**：

- Bundle 过大
- 加载不灵活
- 资源浪费

**过细的分组**：

- Bundle 数量过多
- 依赖关系复杂
- 管理困难

**推荐的分组粒度**：

- 单个 Bundle 不超过 50MB
- 单个 Collector 包含 10-100 个资源
- 按功能模块划分

#### 2.3 共享资源分组

共享资源需要特殊处理：

**共享资源识别**：

被多个模块引用的资源应识别为共享资源。

**共享资源处理**：

```
// 共享资源
var sharedCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Shared",
    GroupName = "Shared",
    PackRuleType = ECollectorPackRuleType.Directory,
    IsShared = true, // 标识为共享资源
};
```

---

### 三、资源标签

#### 3.1 Tag 的作用

资源标签是灵活的分类方式：

**Tag 的应用**：

- 批量加载：通过 Tag 批量加载资源
- 资源分类：按 Tag 分类管理
- 资源筛选：按 Tag 筛选资源

#### 3.2 Tag 的设置

```
// 在 Collector 中设置
var uiCollector = new AssetBundleCollector
{
    CollectPath = "Assets/UI",
    AssetTags = new List<string> { "ui", "critical" },
};

// 在资源上设置
[AssetTag("ui_login")]
public class LoginPanel : MonoBehaviour
{
    // ...
}
```

**Collector 级别 Tag**：

Collector 中的所有资源都自动带有该 Tag。

**资源级别 Tag**：

通过自定义特性为单个资源设置 Tag。

#### 3.3 Tag 的使用

```
// 通过 Tag 加载资源
var handle = package.LoadAssetsByTagAsync<GameObject>("ui", callback);
foreach (var asset in handle.AllAssets)
{
    Instantiate(asset);
}
handle.Release();
```

**批量加载详解**：

通过 Tag 可以一次加载多个相关资源。

**使用场景详解**：

- 加载某个关卡的所有资源
- 加载某个角色的所有资源
- 加载某个 UI 界面的所有资源

---

### 四、平台差异

#### 4.1 平台差异概述

不同平台有特定的资源差异：

**纹理压缩**：

| 平台 | 推荐格式 |
| --- | --- |
| iOS | ASTC、PVRTC |
| Android | ETC2、ASTC |
| Windows | DXT5、BC7 |
| WebGL | DXT5、ETC2 |

**音频格式**：

- iOS：ACC
- Android：OGG、Vorbis
- WebGL：OGG、MP3

**视频格式**：

- 各平台支持的视频格式不同

#### 4.2 平台资源处理

YooAsset 自动按目标平台处理资源：

**自动处理**：

YooAsset 构建时自动选择目标平台的资源格式。

**多格式资源**：

```
// Resources/Textures/
//   texture.png  // 原始 PNG
//   texture@2x.png  // 高分辨率版本
//   texture@ios.astc  // iOS ASTC
//   texture@android.etc2  // Android ETC2
```

**YooAsset 自动选择**：

构建时根据目标平台自动选择合适的资源。

#### 4.3 平台特定配置

```
// 平台特定构建参数
public class BuildParameters
{
    public BuildTarget BuildTarget;
    public Compression Compression;
    public bool EnableEncryption;
}
```

**平台特定优化**：

针对不同平台设置不同的优化选项。

---

### 五、依赖管理

#### 5.1 依赖分析

依赖分析是 YooAsset 的核心功能：

**依赖类型**：

- 直接依赖：A 引用 B
- 间接依赖：A 引用 C，C 引用 B
- 循环依赖：A → B → A（应避免）

**依赖分析工具**：

- AssetBundle Browser
- YooAsset Asset Scanner

**依赖图可视化**：

YooAsset Debugger 提供依赖图可视化。

#### 5.2 依赖优化

**避免循环依赖**：

循环依赖会导致构建失败，需要重构资源结构。

**减少依赖深度**：

减少资源之间的依赖层级，加快加载速度。

**共享依赖**：

将共享资源提取为共享 Bundle。

#### 5.3 依赖加载策略

```
// 同步加载
var handle = package.LoadAssetAsync<GameObject>("prefab");
yield return handle;
Instantiate(handle.AssetObject);

// 预加载依赖
var preloadOp = package.PreloadDependenciesAsync("prefab");
yield until preloadOp.IsDone;
```

**预加载依赖**：

在加载主资源前预加载所有依赖，避免加载卡顿。

**分批加载**：

将资源加载分散到多帧，避免单帧卡顿。

---

### 六、依赖管理实战

#### 6.1 依赖分析示例

```
// 分析 UI 资源的依赖
var dependencies = package.AnalyzeDependencies("ui/login_panel");
// dependencies 包含所有依赖的 Bundle

foreach (var bundle in dependencies)
{
    Debug.Log($"依赖 Bundle: {bundle.BundleName}");
}
```

**依赖查询详解**：

通过资源地址查询所有依赖的 Bundle。

#### 6.2 共享资源提取

```
// 提取共享资源
var sharedResources = package.ExtractSharedResources(assets);
foreach (var shared in sharedResources)
{
    Debug.Log($"共享资源: {shared.AssetPath}");
}
```

**共享资源识别详解**：

自动识别被多个 Bundle 引用的资源。

#### 6.3 循环依赖检测

```
// 检测循环依赖
var cycles = package.DetectDependencyCycles();
if (cycles.Count > 0)
{
    foreach (var cycle in cycles)
    {
        Debug.LogError($"循环依赖: {string.Join(" -> ", cycle)}");
    }
}
```

**循环依赖检测详解**：

使用图算法检测依赖图中的循环。

#### 6.4 依赖优化工具

```
// 优化建议
var suggestions = package.GetOptimizationSuggestions();
foreach (var suggestion in suggestions)
{
    Debug.Log($"优化建议: {suggestion}");
}
```

**优化建议详解**：

YooAsset 提供优化建议，如拆分过大 Bundle、合并过小 Bundle、提取共享资源等。

---

### 七、总结

本章深入解析了 YooAsset 资源组织与依赖管理，包括：

- **资源分组策略**：分组原则、粒度、共享资源分组
- **资源标签**：Tag 的作用、设置、使用
- **平台差异**：平台差异概述、平台资源处理、平台特定配置
- **依赖管理**：依赖分析、依赖优化、依赖加载策略
- **依赖管理实战**：依赖分析、共享资源提取、循环依赖检测、优化工具

通过合理的资源组织和依赖管理，可以提高打包效率、减小包体大小、加快加载速度、避免资源冲突。

---

> **下一篇**： [热更新-版本管理](https://link.juejin.cn/?target=..%2F08-%25E6%25A0%25B8%25E5%25BF%2583%25E6%258A%2580%25E6%259C%25AF-%25E7%2583%25AD%25E6%259B%25B4%25E6%2596%25B0%25E7%25B3%25BB%25E7%25BB%259F%2F01-%25E7%2583%25AD%25E6%259B%25B4%25E6%2596%25B0-%25E7%2589%2588%25E6%259C%25AC%25E7%25AE%25A1%25E7%2590%2586.md "../08-%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-%E7%83%AD%E6%9B%B4%E6%96%B0%E7%B3%BB%E7%BB%9F/01-%E7%83%AD%E6%9B%B4%E6%96%B0-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86.md")

排序方式 :

### **成为第一条评论！**

Nobody's responded to this post yet. Add your thoughts and get the conversation going.

```json
{"@context":"https://schema.org","@graph":[{"@id":"https://www.angryecho.com/c/qian_duan_she_qu/p/P2TBC0j1YSclLwFP4dRa9#post","@type":"DiscussionForumPosting","commentCount":0,"dateModified":"2026-11-02T02:55:56.867Z","datePublished":"2026-11-01T09:25:44.486Z","description":"核心技术-资源组织与依赖 篇章：07-核心技术-资源打包系统 阅读时间：约 25 分钟 前置知识：了解打包策略 一、引言 本章将深入解析 YooAsset 资源组织与依赖管理。合理的资源组织可以提高打包效率、减小包体大小、加快加载速度。依赖管理是资源组织的核心，深入理解依赖管理有助于避免循环依赖、减少冗余打包。","headline":"07-03-打包系统-资源变体与多平台适配","isPartOf":"https://www.angryecho.com/c/qian_duan_she_qu","mainEntityOfPage":"https://www.angryecho.com/c/qian_duan_she_qu/p/P2TBC0j1YSclLwFP4dRa9","text":"核心技术-资源组织与依赖\n\n\n\n篇章：07-核心技术-资源打包系统\n阅读时间：约 25 分钟\n前置知识：了解打包策略\n\n\n\n一、引言\n\n本章将深入解析 YooAsset 资源组织与依赖管理。合理的资源组织可以提高打包效率、减小包体大小、加快加载速度。依赖管理是资源组织的核心，深入理解依赖管理有助于避免循环依赖、减少冗余打包。\n\nYooAsset 提供了多种资源组织方式和强大的依赖分析能力。本章将详细解析资源组织和依赖管理的最佳实践。\n\n\n\n二、资源分组策略\n\n2.1 分组原则\n\n合理的资源分组是打包策略的基础：\n\n按功能分组：\n\n将同一功能的资源放在同一目录或 Collector 下。\n\n// UI 模块\nvar uiCollector = new AssetBundleCollector\n{\n    CollectPath = \"Assets/UI\",\n    GroupName = \"UI\",\n};\n\n// 角色模块\nvar characterCollector = new AssetBundleCollector\n{\n    CollectPath = \"Assets/Characters\",\n    GroupName = \"Characters\",\n};\n\n按加载时机分组：\n\n将同一加载时机的资源放在同一 Collector。\n\n按更新频率分组：\n\n将不同更新频率的资源放在不同 Collector。\n\n2.2 分组粒度\n\n分组粒度需要权衡：\n\n过粗的分组：\n\n\n\n\n\nBundle 过大\n\n\n\n加载不灵活\n\n\n\n资源浪费\n\n过细的分组：\n\n\n\n\n\nBundle 数量过多\n\n\n\n依赖关系复杂\n\n\n\n管理困难\n\n推荐的分组粒度：\n\n\n\n\n\n单个 Bundle 不超过 50MB\n\n\n\n单个 Collector 包含 10-100 个资源\n\n\n\n按功能模块划分\n\n2.3 共享资源分组\n\n共享资源需要特殊处理：\n\n共享资源识别：\n\n被多个模块引用的资源应识别为共享资源。\n\n共享资源处理：\n\n// 共享资源\nvar sharedCollector = new AssetBundleCollector\n{\n    CollectPath = \"Assets/Shared\",\n    GroupName = \"Shared\",\n    PackRuleType = ECollectorPackRuleType.Directory,\n    IsShared = true, // 标识为共享资源\n};\n\n\n\n三、资源标签\n\n3.1 Tag 的作用\n\n资源标签是灵活的分类方式：\n\nTag 的应用：\n\n\n\n\n\n批量加载：通过 Tag 批量加载资源\n\n\n\n资源分类：按 Tag 分类管理\n\n\n\n资源筛选：按 Tag 筛选资源\n\n3.2 Tag 的设置\n\n// 在 Collector 中设置\nvar uiCollector = new AssetBundleCollector\n{\n    CollectPath = \"Assets/UI\",\n    AssetTags = new List\u003Cstring> { \"ui\", \"critical\" },\n};\n\n// 在资源上设置\n[AssetTag(\"ui_login\")]\npublic class LoginPanel : MonoBehaviour\n{\n    // ...\n}\n\nCollector 级别 Tag：\n\nCollector 中的所有资源都自动带有该 Tag。\n\n资源级别 Tag：\n\n通过自定义特性为单个资源设置 Tag。\n\n3.3 Tag 的使用\n\n// 通过 Tag 加载资源\nvar handle = package.LoadAssetsByTagAsync\u003CGameObject>(\"ui\", callback);\nforeach (var asset in handle.AllAssets)\n{\n    Instantiate(asset);\n}\nhandle.Release();\n\n批量加载详解：\n\n通过 Tag 可以一次加载多个相关资源。\n\n使用场景详解：\n\n\n\n\n\n加载某个关卡的所有资源\n\n\n\n加载某个角色的所有资源\n\n\n\n加载某个 UI 界面的所有资源\n\n\n\n四、平台差异\n\n4.1 平台差异概述\n\n不同平台有特定的资源差异：\n\n纹理压缩：\n\n\n\n\n\n\n\n平台\n\n\n\n推荐格式\n\n\n\n\n\niOS\n\n\n\nASTC、PVRTC\n\n\n\n\n\nAndroid\n\n\n\nETC2、ASTC\n\n\n\n\n\nWindows\n\n\n\nDXT5、BC7\n\n\n\n\n\nWebGL\n\n\n\nDXT5、ETC2\n\n音频格式：\n\n\n\n\n\niOS：ACC\n\n\n\nAndroid：OGG、Vorbis\n\n\n\nWebGL：OGG、MP3\n\n视频格式：\n\n\n\n\n\n各平台支持的视频格式不同\n\n4.2 平台资源处理\n\nYooAsset 自动按目标平台处理资源：\n\n自动处理：\n\nYooAsset 构建时自动选择目标平台的资源格式。\n\n多格式资源：\n\n// Resources/Textures/\n//   texture.png  // 原始 PNG\n//   texture@2x.png  // 高分辨率版本\n//   texture@ios.astc  // iOS ASTC\n//   texture@android.etc2  // Android ETC2\n\nYooAsset 自动选择：\n\n构建时根据目标平台自动选择合适的资源。\n\n4.3 平台特定配置\n\n// 平台特定构建参数\npublic class BuildParameters\n{\n    public BuildTarget BuildTarget;\n    public Compression Compression;\n    public bool EnableEncryption;\n}\n\n平台特定优化：\n\n针对不同平台设置不同的优化选项。\n\n\n\n五、依赖管理\n\n5.1 依赖分析\n\n依赖分析是 YooAsset 的核心功能：\n\n依赖类型：\n\n\n\n\n\n直接依赖：A 引用 B\n\n\n\n间接依赖：A 引用 C，C 引用 B\n\n\n\n循环依赖：A → B → A（应避免）\n\n依赖分析工具：\n\n\n\n\n\nAssetBundle Browser\n\n\n\nYooAsset Asset Scanner\n\n依赖图可视化：\n\nYooAsset Debugger 提供依赖图可视化。\n\n5.2 依赖优化\n\n避免循环依赖：\n\n循环依赖会导致构建失败，需要重构资源结构。\n\n减少依赖深度：\n\n减少资源之间的依赖层级，加快加载速度。\n\n共享依赖：\n\n将共享资源提取为共享 Bundle。\n\n5.3 依赖加载策略\n\n// 同步加载\nvar handle = package.LoadAssetAsync\u003CGameObject>(\"prefab\");\nyield return handle;\nInstantiate(handle.AssetObject);\n\n// 预加载依赖\nvar preloadOp = package.PreloadDependenciesAsync(\"prefab\");\nyield until preloadOp.IsDone;\n\n预加载依赖：\n\n在加载主资源前预加载所有依赖，避免加载卡顿。\n\n分批加载：\n\n将资源加载分散到多帧，避免单帧卡顿。\n\n\n\n六、依赖管理实战\n\n6.1 依赖分析示例\n\n// 分析 UI 资源的依赖\nvar dependencies = package.AnalyzeDependencies(\"ui/login_panel\");\n// dependencies 包含所有依赖的 Bundle\n\nforeach (var bundle in dependencies)\n{\n    Debug.Log($\"依赖 Bundle: {bundle.BundleName}\");\n}\n\n依赖查询详解：\n\n通过资源地址查询所有依赖的 Bundle。\n\n6.2 共享资源提取\n\n// 提取共享资源\nvar sharedResources = package.ExtractSharedResources(assets);\nforeach (var shared in sharedResources)\n{\n    Debug.Log($\"共享资源: {shared.AssetPath}\");\n}\n\n共享资源识别详解：\n\n自动识别被多个 Bundle 引用的资源。\n\n6.3 循环依赖检测\n\n// 检测循环依赖\nvar cycles = package.DetectDependencyCycles();\nif (cycles.Count > 0)\n{\n    foreach (var cycle in cycles)\n    {\n        Debug.LogError($\"循环依赖: {string.Join(\" -> \", cycle)}\");\n    }\n}\n\n循环依赖检测详解：\n\n使用图算法检测依赖图中的循环。\n\n6.4 依赖优化工具\n\n// 优化建议\nvar suggestions = package.GetOptimizationSuggestions();\nforeach (var suggestion in suggestions)\n{\n    Debug.Log($\"优化建议: {suggestion}\");\n}\n\n优化建议详解：\n\nYooAsset 提供优化建议，如拆分过大 Bundle、合并过小 Bundle、提取共享资源等。\n\n\n\n七、总结\n\n本章深入解析了 YooAsset 资源组织与依赖管理，包括：\n\n\n\n\n\n资源分组策略：分组原则、粒度、共享资源分组\n\n\n\n资源标签：Tag 的作用、设置、使用\n\n\n\n平台差异：平台差异概述、平台资源处理、平台特定配置\n\n\n\n依赖管理：依赖分析、依赖优化、依赖加载策略\n\n\n\n依赖管理实战：依赖分析、共享资源提取、循环依赖检测、优化工具\n\n通过合理的资源组织和依赖管理，可以提高打包效率、减小包体大小、加快加载速度、避免资源冲突。\n\n\n\n\n\n下一篇：热更新-版本管理","url":"https://www.angryecho.com/c/qian_duan_she_qu/p/P2TBC0j1YSclLwFP4dRa9","author":{"@type":"Person","name":"SmalBox","url":"https://www.angryecho.com/u/F2OSmalBox"},"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":0},{"@type":"InteractionCounter","interactionType":"https://schema.org/DislikeAction","userInteractionCount":0},{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":0},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":0}]}]}
```

## Sitemap

See the full [sitemap](https://www.angryecho.com/sitemap.md) for all pages.
