本系列文章翻译自:
https://learn.unity.com/tutorial/assets-resources-and-assetbundles

这是一系列文章,深入讨论了Unity引擎中的资产(Asset)和资源管理(Resource Management)。旨在为高级开发人员提供Unity资产和序列化系统的深入原理的知识。研究了Unity的AssetBundle系统的技术基础和当前使用它们的最佳使用方法。

该指南分为四章:

  1. 资产,对象和序列化(Assets,Objects and serialization)讨论了Unity如何序列化资产和处理资产之间引用的底层细节。强烈建议读者从本章开始,因为它介绍了整个指南中使用的术语。
  2. Resources 文件夹 讨论了内置的 Resources API。
  3. AssetBundle 基础知识 是建立在第1章的知识基础上,用于描述 AssetBundles 的运作方式,并讨论 AssetBundles 的加载和 AssetBundles 的资产加载。
  4. AssetBundle 使用指南 是一篇长篇文章,讨论 AssetBundles 实际使用的许多方式。包括将有关将资产分配给 AssetBundles 和管理已加载资产的部分,并描述了使用 AssetBundles 的开发人员遇到的许多常见问题。

注意:本指南的 ObjectsAssets 术语与Unity的API中命名有所不同。

本指南调用 Objects 的数据在许多 Unity API 中称为 Assets,例如AssetBundle.LoadAssetResources.UnloadUnusedAssets。本指南称之为 Assets 的文件很少暴露给任何公共API。当它们被公开时,通常只在与构建相关的代码中,例如AssetDatabaseBuildPipeline。在这些情况下,它们在公共API 中称为文件(files)

0×01 资源系统的最佳实践

不要使用它。

这个强烈的建议有几个原因:

  • 使用Resources文件夹会使精细化内存管理变得更加困难;
  • 资源文件夹使用不当会增加应用程序启动时间和构建时间;
    • 随着资源文件夹数量的增加,对这些文件夹中的资产的管理亦变得非常困难。
  • 资源系统降低了项目向特定平台提供自定义内容的能力,并消除了增量内容升级的可能性;
    • AssetBundle Variants是Unity基于每个设备调整内容的主要工具。

0×02 正确使用资源系统

有两个特定用例,其中资源系统可以提供帮助,而不会妨碍良好的开发实践:

  1. Resources文件夹的易用性使其成为快速原型的优秀系统。但是,当项目进入完全生产阶段时,应该尽量减少Resources文件夹的使用。
  2. 如果内容在一些简单的情况下,Resources文件夹可能很有用。
  3. 通常在整个项目的生命周期中都需要。
  4. 不是内存密集型的。
  5. 不容易修补,或者不会跨平台或设备变化。
  6. 用于最小的自举。

第二种情况的示例包括用于托管预制件的MonoBehaviour单例,或包含第三方配置数据的ScriptableObject,例如Facebook App ID。

0×03 资源的序列化

在构建项目时,名为 “Resources” 的所有文件夹中的 Assets 和 Objects 将合并为一个序列化文件。此文件还包含元数据和索引信息,类似于 AssetBundle。如 AssetBundle文档 中所述,此索引包括一个序列化查找树,用于将给定 Object 的名称解析为其相应的 File GUID 和 Local ID。它还用于在序列化文件正文中的特定字节偏移处定位 Object。

在绝大多数平台上,查找数据结构是平衡搜索树,其构造时间以 O(n log(n)) 速率增长。随着 Resources 文件夹中对象数量的增加,这种增长也会导致索引加载时间超过线性增长。

而且此操作是不可映射的,并且在应用程序启动时发生,同时显示初始非交互式启动屏幕。已经观察到初始化包含 10,000 个资产的资源系统在低端移动设备上消耗多秒,即使这个资源文件夹中的大多数对象实际上很少需要在应用程序的第一个场景中加载。

-EOF-