Addressable|Addressable Asset System(进阶版AB)和AssetBundle(以下简称AB)制作的资源管理系统的对比

介绍

  • AB作为之前Unity主推的资源管理工作流,可以把模型、贴图、预制体、声音、甚至整个场景都打入压缩包中,然后在游戏过程中再加载。使用他的主要目的有以下几点:1.统一的资源管理、2.做分包、3.热更资源。他也有一个最大的缺点就是需要开发者自己写一套资源管理系统来管理依赖、引用关系。
  • 可寻址资源系统是现在Unity现在主推的资源管理工作流,他的基石是AB,所以他拥有之前AB所有的功能。并且他已经帮助开发者实现了资源管理系统。
打包对比
AB打包方式
  • AB使用BuildPipeline.BuildAssetBundles(string outputPath , BuildAssetBundleOptions options, BuildTarget target)接口对所有标记为ab资产的资源进行打包。
    • outputPath:打包后的资源输出路径
    • options:使用什么方式对资产进行打包。
      • BuildAssetBundleOptions.None:此捆绑包选项使用LZMA格式压缩。这样打包后的资源占用磁盘空间最小,但是使用时必须解压缩整个捆绑包一次,加载速度会更慢。
      • BuildAssetBundleOptions.UncompressedAssetBundle:此包选项以完全未压缩数据的方式构建包。解压缩的缺点是文件下载量较大。但是,一旦下载,加载时间将最快。
      • BuildAssetBundleOptions.ChunkBasedCompression:此捆绑包选项使用一种称为LZ4的压缩方法,与LZMA相比,其压缩文件大小更大,但与LZMA不同,不需要使用整个捆绑包进行解压缩后才能使用。LZ4使用基于块的算法,该算法允许以片段或“块”的形式加载AB。
      使用ChunkBasedCompression具有与未压缩的包相当的加载时间,并具有减小磁盘大小的额外好处。
    • target:此参数决定了当前构建的捆绑包用于哪一个目标平台。
  • AB文件
    这是一个缺少.manifest扩展名的文件,以及您在运行时要加载的资源,以加载资产。
AB文件是一个存档,在内部包含多个文件。此存档的结构可能会略有变化,具体取决于它是普通AB还是场景AB。这是普通AB的结构:

Addressable|Addressable Asset System(进阶版AB)和AssetBundle(以下简称AB)制作的资源管理系统的对比
文章图片
img
场景AB与普通的AB不同,因为它已针对场景及其内容的流加载进行了优化。

Addressable|Addressable Asset System(进阶版AB)和AssetBundle(以下简称AB)制作的资源管理系统的对比
文章图片
image.png
  • 清单文件
    对于每个生成的捆绑包,包括附加的清单捆绑包,都会生成一个关联的清单文件。清单文件可以使用任何文本编辑器打开,并且包含诸如捆绑包的循环冗余校验(CRC)数据和依赖项数据之类的信息。对于普通的AB,其清单文件将如下所示:
    ManifestFileVersion: 0 CRC: 2422268106 Hashes: AssetFileHash: serializedVersion: 2 Hash: 8b6db55a2344f068cf8a9be0a662ba15 TypeTreeHash: serializedVersion: 2 Hash: 37ad974993dbaa77485dd2a0c38f347a HashAppended: 0 ClassTypes: - Class: 91 Script: {instanceID: 0} Assets: Asset_0: Assets/Mecanim/StateMachine.controller Dependencies: {}

Addressable打包方式
  • Addressable跟AB的打包方式有所不同,因为它可以选择种中播放模式,如下图所示

    Addressable|Addressable Asset System(进阶版AB)和AssetBundle(以下简称AB)制作的资源管理系统的对比
    文章图片
    1574170947802.png
    • Fast Mode: 快速模式:直接加载文件而不打包,快速但Profiler获取的信息较少;在此模式下,我们实际上时使用 AssetDatabase.LoadAssetAtPath 直接加载文件。
    • Virtual Mode:虚拟模式:在不打包的情况下模拟靠近AB的操作;与FastMode不同,您可以查看哪个AB包含资产。此模式最终还加载了AssetDatabase.LoadAssetAtPath 。
    • Packed Mode:打包模式:实际上是从AB打包和加载;在这种模式下,实际构建并加载AB。
    如果在编辑器模式下使用Addressable推荐使用Virtual Mode来模拟打包加载,在真正要上线期间再使用Packed Play Mode 来进行打包加载。
加载资源对比
AB加载方式 我们用AB来加载资源的过程中,主要包含两个过程,第一步是先要加载本地或者网络上的AB资产包,再通过操作这个AB来加载它里面所包含的资源。
  • 加载AB有以下三种方式:
    • public static AssetBundle LoadFromFile(string path, uint crc, ulong offset);
      path 磁盘上文件的路径。
      crc 未压缩内容的可选CRC-32校验。如果它不为零,则在加载内容之前将其与校验和进行比较,如果不匹配则给出错误。
      offset 可选的字节偏移量。该值指定从何处开始读取AB。
      这是本地磁盘加载到内存中所以是加载ab包最快的方式,它可以加载任意压缩形式的ab包。
    • public static AssetBundle LoadFromMemory(byte[] binary, uint crc);
    binary 具有AB数据的字节数组。
    crc 未压缩内容的可选CRC-32校验和。如果它不为零,则在加载内容之前将其与校验和进行比较,如果不匹配则给出错误。
    ? 使用此方法从字节数组创建AB。当下载带有加密的数据并且需要从未加密的字节创建AB时,这很有用。
    • public static Networking.UnityWebRequest GetAssetBundle(string uri, uint version, uint crc);
      uri 要下载的资产捆绑包的URI
      version 版本号,它将与要下载的资产捆绑包的缓存版本进行比较。如果不一样则则将重新下载资产捆绑。
      crc 版本哈希。如果此哈希与该资产捆绑的缓存版本的哈希不匹配,则将重新下载资产捆绑。
      创建一个优化的UnityWebRequest,用于通过HTTP GET下载Unity资产捆绑包。
  • 从AB中加载资源的方式
    public LoadAsset (string name);
    • name:资源名称
    • T:资源类型
      该接口可以同步的加载资源
    public AssetBundleRequest LoadAssetAsync(string name);
    • name:资源名称
      该接口可以异步的加载资源
Addressable加载方式 我们首先把资源标记为可寻址,可寻址资源系统会给我们一个它的地址,然后我们可以根据这个地址去异步加载资源。可寻址资源系统的加载资源方式都是异步的,所以我们需要监听它加载完成再使用。