# Unity资源按需加载概述
# 一.为什么需要按需加载资源
资源按需下载是游戏中很重要的一项技术,避免了游戏过大的包体大小,主流的手机游戏几乎都重度使用了该项技术。 大概做法是,将首场景及一些必须的内容放到首包内,在运行中根据玩家的需求动态下载所需素材。
对于小游戏而言,存在即点即玩的需求,应尽快缩短用户从点击到游玩体验之间的时间,对于资源加载而言,必须做到最大限度地缩减首包的体积,能延迟加载的都进行延迟加载处理。
# 二、主流方案
Unity中现在较为主流的资源管理系统有Addressables、Asset Bundle。值得注意的是, TapTap 小游戏环境中不支持对本地的 Bundle 进行加载,因此无论哪种方案最终都采用上传 CDN 方式在游戏运行时异步按需下载。
# 2.1 Asset Bundle
Asset Bundle是Unity提供的底层的资源加载方式,AssetBundle是一个存档文件包含了非代码资源,如模型、纹理、音频、场景等,还可包括如ScriptableObject等的序列化数据。工作流程为,先将资产标记为AssetBundle文件,生成AssetBundle文件,在运行时加载AssetBundle文件。
需要注意的是在加载AssetBundle文件时,会一次性将整个AssetBundle读入内存,因此对资源合理地分组非常重要。AssetBundle对于依赖项需要手动将其加载进内存,由于资源分组是手动进行的,可能会存在被多依赖的资产被重复打包进AssetBundle,从而造成资源冗余,因此在打包前需要对资源做依赖分析,尽可能消除冗余,建议可使用Addressables消除冗余。
对于AssetBundle的接口可以参考官方文档
https://docs.unity3d.com/2021.3/Documentation/Manual/AssetBundles-Workflow.html (opens new window)
# 2.2 Addressables
Addressables是Unity针对AssetBundle配置过于繁琐做出的一种解决方案。Addressables使用了一种基于标签的打包方式,可以根据资源的标签进行打包,不需要手动配置依赖关系。同时Addressables内置了远程加载和动态更新等相对更高级的接口,使用起来更加简便和方便。
对于Addressable而言,提供了更为直观的UI配置界面,是现在主流的资源加载方案。
# 两种方案对比
Asset Bundle | Addressables | |
---|---|---|
技术原理 | Unity底层资源加载方式 | 对Asset Bundle做了一层封装 |
学习成本 | 大,需要手动组织Bundle,手动设置依赖关系等,后期维护成本较大 | 适中,自动关联依赖,自动分组等。 |
自选CDN | 支持 | 支持 |
配置复杂程度 | 较为复杂 | 中等 |
代码修改量 | 较多 | 多 |
# 三、方案选择建议
不同的游戏对于运行时,加载时,开发时的要求不尽相同,因此不同的游戏也应选择不同的方案,同于同一种方案也应选择不同的侧重点。
- 游戏工程本身已采用完善的 Addressables/AssetBundle 资源管理,建议继续沿用常规资源加载方案,且有助于后续压缩纹理等优化工作的进行有效提升游戏运行性能;
- 对于相对较为大型的游戏,不推荐使用Addressables,原因是Addressables中的catalog会随着资源变多而膨胀,其中对JSON文件的解析需要花费较多时间。
- 对于AssetBundle而言,理想情况下会比Addressables等更快,但是会导致较多的开发时间。建议根据项目情况自行评估开发时间以及最终性能之间的取舍关系。