核心技术-资源打包策略
篇章 :07-核心技术-资源打包系统 阅读时间 :约 30 分钟 前置知识:了解 YooAsset 基础概念
一、引言
本章将深入解析 YooAsset 资源打包策略。资源打包是 YooAsset 资源管理的核心环节,合理的打包策略可以显著提升游戏性能、减小包体大小、加快加载速度。深入理解打包策略是使用好 YooAsset 的关键。
YooAsset 提供了灵活的打包规则和多种打包策略,本章将详细解析这些策略的原理、适用场景和最佳实践。
二、打包基础
2.1 Bundle 大小控制
Bundle 大小是打包策略中的重要考虑因素:
Bundle 过大:
- 单个 Bundle 超过 50MB 会导致下载时间长
- 加载时占用大量内存
- 加载时间长,影响用户体验
Bundle 过小:
- Bundle 数量过多,增加管理复杂度
- 频繁的 I/O 操作影响性能
- 依赖关系复杂
推荐的 Bundle 大小:
- 移动端:1-10MB
- PC 端:5-50MB
- WebGL:1-5MB
- 单个 Bundle 不超过 50MB
2.2 资源分类
合理的资源分类是打包策略的基础:
按类型分类:
- UI 资源:界面 Prefab、图片、字体
- 角色资源:模型、动画、贴图
- 场景资源:场景文件、灯光
- 音频资源:背景音乐、音效
- 数据资源:JSON、XML、ScriptableObject
按使用频率分类:
- 启动必需:登录、主场景
- 常用资源:UI、角色
- 偶尔使用:剧情、动画
- 极少使用:隐藏内容
按更新频率分类:
- 稳定资源:基本不变的资源
- 经常更新:活动、节日内容
- 极少更新:核心玩法
三、打包策略
3.1 基础打包策略
按目录打包:
将同一目录下的资源打包到一个 Bundle。
csharp
// 整个 UI 目录打包
var uiCollector = new AssetBundleCollector
{
CollectPath = "Assets/UI",
PackRuleType = ECollectorPackRuleType.Directory,
};
优点:
- 简单直观
- 便于管理
缺点:
- 可能导致 Bundle 过大或过小
适用场景:
- 模块边界清晰的资源
按 Prefab 打包:
每个 Prefab 单独打包到一个 Bundle。
csharp
// 每个 UI Prefab 单独打包
var prefabCollector = new AssetBundleCollector
{
CollectPath = "Assets/UI/Prefabs",
PackRuleType = ECollectorPackRuleType.Prefab,
};
优点:
- Bundle 大小可控
- 依赖关系清晰
缺点:
- 共享资源被多次打包
适用场景:
- 独立功能模块
3.2 高级打包策略
依赖共享打包:
将多个模块共享的资源提取为共享 Bundle。
csharp
// 共享资源
var sharedCollector = new AssetBundleCollector
{
CollectPath = "Assets/Shared",
PackRuleType = ECollectorPackRuleType.Directory,
};
// 业务模块
var moduleACollector = new AssetBundleCollector
{
CollectPath = "Assets/ModuleA",
PackRuleType = ECollectorPackRuleType.Directory,
SharedPackRule = true, // 共享依赖资源
};
优点:
- 减少冗余
- 减小包体
缺点:
- 依赖关系复杂
适用场景:
- 多个模块共享资源
分层打包:
将资源按重要性分层打包。
csharp
// 核心层:启动必需
var coreCollector = new AssetBundleCollector
{
CollectPath = "Assets/Core",
PackRuleType = ECollectorPackRuleType.Directory,
BundlePriority = 100, // 最高优先级
};
// 业务层:常用
var businessCollector = new AssetBundleCollector
{
CollectPath = "Assets/Business",
PackRuleType = ECollectorPackRuleType.Directory,
BundlePriority = 50,
};
// 内容层:偶尔使用
var contentCollector = new AssetBundleCollector
{
CollectPath = "Assets/Content",
PackRuleType = ECollectorPackRuleType.Directory,
BundlePriority = 10,
};
优点:
- 支持精细化加载
- 优化启动性能
缺点:
- 配置复杂
适用场景:
- 大型游戏
3.3 动态打包策略
按标签打包:
通过 Tag 灵活控制资源归属。
csharp
// 通过 Tag 分类
var taggedAssets = assets
.Where(a => a.HasTag("critical"))
.ToList();
优点:
- 灵活
- 不依赖目录结构
缺点:
- 需要额外维护 Tag
按版本打包:
不同版本打包不同的 Bundle。
csharp
if (isStableVersion)
{
// 稳定版本打包
}
else
{
// 测试版本打包
}
适用场景:
- A/B 测试
- 多版本管理
四、依赖管理
4.1 依赖分析
依赖分析是打包策略的关键:
依赖分析工具:
- AssetBundle Browser:Unity 内置
- YooAsset Asset Scanner:内置扫描工具
- Addressables Analyze:Addressables 工具
依赖关系:
- 直接依赖:A 引用 B
- 间接依赖:A 引用 C,C 引用 B
- 循环依赖:A → B → A(应避免)
4.2 共享资源处理
共享资源是依赖管理的关键:
共享 Bundle:
csharp
// 提取共享资源为独立 Bundle
var sharedBundle = ExtractSharedResources(assets);
共享资源识别:
被多个 Bundle 引用的资源应提取为共享 Bundle。
共享 Bundle 优势:
- 减少冗余打包
- 减小包体
- 加快加载
4.3 依赖图优化
csharp
// 优化依赖图
public class DependencyOptimizer
{
public void OptimizeDependencies(BuildMap buildMap)
{
// 1. 检测循环依赖
DetectCycles(buildMap);
// 2. 提取共享资源
ExtractSharedAssets(buildMap);
// 3. 优化 Bundle 大小
OptimizeBundleSize(buildMap);
}
}
循环依赖检测:
使用图算法检测循环依赖。
共享资源提取:
将共享资源提取为独立 Bundle。
Bundle 大小优化:
通过拆分或合并优化 Bundle 大小。
五、分包策略
5.1 安装包分包
将资源分为包内资源和可更新资源:
包内资源:
- 启动必需
- 核心玩法
- 不需要热更新
可更新资源:
- 内容更新
- Bug 修复
- 活动内容
实现:
csharp
// 包内资源 Collector
var buildinCollector = new AssetBundleCollector
{
CollectPath = "Assets/Core",
PackRuleType = ECollectorPackRuleType.Directory,
BuildInBuildPipeline = true, // 打包到包内
};
// 可更新资源 Collector
var updatableCollector = new AssetBundleCollector
{
CollectPath = "Assets/Content",
PackRuleType = ECollectorPackRuleType.Directory,
BuildInBuildPipeline = false, // 不打包到包内
};
5.2 渠道分包
不同渠道的包内容不同:
渠道差异:
- 应用商店要求
- 平台限制
- 法律法规
实现:
csharp
// 根据渠道配置
public class ChannelConfig
{
public string ChannelName;
public List<string> Bundles;
}
5.3 平台分包
不同平台的资源不同:
平台差异:
- 纹理压缩格式(DXT、ETC、PVRTC、ASTC)
- 着色器精度
- 字体和本地化
实现:
YooAsset 自动按目标平台构建,无需手动配置。
六、最佳实践
6.1 启动性能优化
启动必需资源:
将启动必需的资源打包到包内。
按需加载:
非启动必需资源按需加载。
预加载:
在游戏空闲时预加载未来需要的资源。
6.2 内存优化
Bundle 大小控制:
避免单个 Bundle 过大。
资源复用:
通过共享 Bundle 减少内存占用。
及时释放:
不再使用的资源及时释放。
6.3 包体优化
压缩策略:
根据资源类型选择合适的压缩方式。
冗余消除:
通过共享 Bundle 消除冗余。
按需包含:
只包含必要的资源。
6.4 加载性能优化
预加载:
游戏启动时预加载常用资源。
分帧加载:
将资源加载分散到多帧。
优先级管理:
关键资源优先加载。
七、总结
本章深入解析了 YooAsset 资源打包策略,包括:
- 打包基础:Bundle 大小控制、资源分类
- 打包策略:基础策略(按目录、按 Prefab)、高级策略(依赖共享、分层)、动态策略(按标签、按版本)
- 依赖管理:依赖分析、共享资源处理、依赖图优化
- 分包策略:安装包分包、渠道分包、平台分包
- 最佳实践:启动性能、内存、包体、加载性能
通过合理的打包策略,可以显著提升游戏性能、减小包体大小、加快加载速度。
下一篇 :核心技术-压缩与加密