核心技术-资源组织与依赖
篇章 :07-核心技术-资源打包系统 阅读时间 :约 25 分钟 前置知识:了解打包策略
一、引言
本章将深入解析 YooAsset 资源组织与依赖管理。合理的资源组织可以提高打包效率、减小包体大小、加快加载速度。依赖管理是资源组织的核心,深入理解依赖管理有助于避免循环依赖、减少冗余打包。
YooAsset 提供了多种资源组织方式和强大的依赖分析能力。本章将详细解析资源组织和依赖管理的最佳实践。
二、资源分组策略
2.1 分组原则
合理的资源分组是打包策略的基础:
按功能分组:
将同一功能的资源放在同一目录或 Collector 下。
csharp
// 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 共享资源分组
共享资源需要特殊处理:
共享资源识别:
被多个模块引用的资源应识别为共享资源。
共享资源处理:
csharp
// 共享资源
var sharedCollector = new AssetBundleCollector
{
CollectPath = "Assets/Shared",
GroupName = "Shared",
PackRuleType = ECollectorPackRuleType.Directory,
IsShared = true, // 标识为共享资源
};
三、资源标签
3.1 Tag 的作用
资源标签是灵活的分类方式:
Tag 的应用:
- 批量加载:通过 Tag 批量加载资源
- 资源分类:按 Tag 分类管理
- 资源筛选:按 Tag 筛选资源
3.2 Tag 的设置
csharp
// 在 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 的使用
csharp
// 通过 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 构建时自动选择目标平台的资源格式。
多格式资源:
csharp
// Resources/Textures/
// texture.png // 原始 PNG
// texture@2x.png // 高分辨率版本
// texture@ios.astc // iOS ASTC
// texture@android.etc2 // Android ETC2
YooAsset 自动选择:
构建时根据目标平台自动选择合适的资源。
4.3 平台特定配置
csharp
// 平台特定构建参数
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 依赖加载策略
csharp
// 同步加载
var handle = package.LoadAssetAsync<GameObject>("prefab");
yield return handle;
Instantiate(handle.AssetObject);
// 预加载依赖
var preloadOp = package.PreloadDependenciesAsync("prefab");
yield until preloadOp.IsDone;
预加载依赖:
在加载主资源前预加载所有依赖,避免加载卡顿。
分批加载:
将资源加载分散到多帧,避免单帧卡顿。
六、依赖管理实战
6.1 依赖分析示例
csharp
// 分析 UI 资源的依赖
var dependencies = package.AnalyzeDependencies("ui/login_panel");
// dependencies 包含所有依赖的 Bundle
foreach (var bundle in dependencies)
{
Debug.Log($"依赖 Bundle: {bundle.BundleName}");
}
依赖查询详解:
通过资源地址查询所有依赖的 Bundle。
6.2 共享资源提取
csharp
// 提取共享资源
var sharedResources = package.ExtractSharedResources(assets);
foreach (var shared in sharedResources)
{
Debug.Log($"共享资源: {shared.AssetPath}");
}
共享资源识别详解:
自动识别被多个 Bundle 引用的资源。
6.3 循环依赖检测
csharp
// 检测循环依赖
var cycles = package.DetectDependencyCycles();
if (cycles.Count > 0)
{
foreach (var cycle in cycles)
{
Debug.LogError($"循环依赖: {string.Join(" -> ", cycle)}");
}
}
循环依赖检测详解:
使用图算法检测依赖图中的循环。
6.4 依赖优化工具
csharp
// 优化建议
var suggestions = package.GetOptimizationSuggestions();
foreach (var suggestion in suggestions)
{
Debug.Log($"优化建议: {suggestion}");
}
优化建议详解:
YooAsset 提供优化建议,如拆分过大 Bundle、合并过小 Bundle、提取共享资源等。
七、总结
本章深入解析了 YooAsset 资源组织与依赖管理,包括:
- 资源分组策略:分组原则、粒度、共享资源分组
- 资源标签:Tag 的作用、设置、使用
- 平台差异:平台差异概述、平台资源处理、平台特定配置
- 依赖管理:依赖分析、依赖优化、依赖加载策略
- 依赖管理实战:依赖分析、共享资源提取、循环依赖检测、优化工具
通过合理的资源组织和依赖管理,可以提高打包效率、减小包体大小、加快加载速度、避免资源冲突。
下一篇 :热更新-版本管理