【Addressable】Catalog文件大小优化

在 Unity 中使用 Addressables 系统时,Addressable Catalog 文件的大小可能会影响加载时间和性能。以下是一些降低 Addressable Catalog 文件大小的方法:

1. 减少冗余的地址标签

确保每个 Addressable 资产只使用必要的标签。避免给每个资产附加过多的标签,因为标签会增加 Catalog 文件的大小。

2. 减少资源包数量

尽量减少资源包(Asset Bundles)的数量。更多的资源包会导致更多的元数据存储在 Catalog 中,从而增加其大小。合并小的资源包到较大的资源包中可以减小 Catalog 文件的大小。

3. 使用 Addressable 的分组功能

将相关的 Addressable 资产分组在一起。通过合并同一组中的资源包,Catalog 文件可以更紧凑。配置每个组的打包模式时,选择“Pack Together”而不是“Pack Separately”可以减少 Catalog 文件大小。

4. 清理未使用的地址和标签

定期清理未使用的地址和标签。未使用的地址和标签会增加 Catalog 文件的大小而没有实际的用途。

5. 优化资源路径

使用简洁且有意义的路径命名地址(Addressable Paths)。路径越长,Catalog 文件越大。尽量使用短路径并避免不必要的嵌套。

6. 调整压缩设置

Addressable 资源包支持压缩,Catalog 文件本身也可以通过压缩减小其大小。检查并调整资源包的压缩设置。

7. 分布式 Catalog 文件

将 Catalog 文件拆分为多个部分并根据需要加载。Unity Addressables 支持加载分布式 Catalog 文件,这样可以减少初始加载的 Catalog 文件大小。

---------------------------------------------------------------------------------------------------------------------------------------
上面部分是可以有效减小Catalog文件大小,减低初始化读取配置时间
但是可能会对我们原来的功能设计产生或多或少的影响
通过对Catalog文件里面的数据解析,发现里面占比比较大的内容

"m_ExtraDataString": "H4sIAAAAAAAACuy9264lyZIc5tALf4Pg82iQGZmRmSGAD+..."

去找了一下构建代码里面相关的这块数据生成

//转换存储
m_ExtraDataString = Convert.ToBase64String(extraDataList.ToArray());

//读取存储数据
var extraData = Convert.FromBase64String(m_ExtraDataString);

它是将 byte 数组使用 Base64 编码转换为字符串存储,再反编译回 byte 数组。(Base64 编码是一种将二进制数据表示为 ASCII 字符串的方法,方便储存和传输)

我先将这里注释了,发现生成出来的m_ExtraDataString为空,Catalog文件的确小了很多
就只能想办法去减小这里生成出来的数据

压缩数据:在将 byte 数组转换为 Base64 字符串之前,可以使用压缩算法来减小数据大小。常用的压缩算法包括 GZip 和 Deflate。

using System;
using System.IO;
using System.IO.Compression;

public class ByteArrayToCompressedBase64
{
    public static string ConvertByteArrayToCompressedBase64(byte[] byteArray)
    {
        // 使用内存流和 GZipStream 进行压缩
        using (var output = new MemoryStream())
        {
            using (var gzip = new GZipStream(output, CompressionLevel.Optimal))
            {
                gzip.Write(byteArray, 0, byteArray.Length);
            }
            return Convert.ToBase64String(output.ToArray());
        }
    }
public static byte[] ConvertCompressedBase64ToByteArray(string base64String)
    {
        // 将 Base64 字符串解码为压缩后的 byte 数组
        byte[] compressedData = Convert.FromBase64String(base64String);

        // 使用内存流和 GZipStream 进行解压缩
        using (var input = new MemoryStream(compressedData))
        {
            using (var output = new MemoryStream())
            {
                using (var gzip = new GZipStream(input, CompressionMode.Decompress))
                {
                    gzip.CopyTo(output);
                }
                return output.ToArray();
            }
        }
    }
}
View Code

使用上面的压缩处理,我将Catalog文件里面其他相似数据转换都做了处理
Catalog文件大小变化 (1569个Bundle)
压缩前:json文件(2431 KB)

压缩后:json文件 (520 KB)
这个压缩率还是很可观的,加载使用暂时没有出现问题,完美!!!
(注意,资源构建和资源加载工程分开的,要保持上面压缩代码同步都修改掉,不然可能会造成压缩数据无法正常加载!!)

 

posted @ 2024-06-20 15:47  lovewaits  阅读(15)  评论(0编辑  收藏  举报