【Addressable】Catalog檔案大小最佳化

lovewaits發表於2024-06-20

在 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。

【Addressable】Catalog檔案大小最佳化
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)
這個壓縮率還是很可觀的,載入使用暫時沒有出現問題,完美!!!
(注意,資源構建和資源載入工程分開的,要保持上面壓縮程式碼同步都修改掉,不然可能會造成壓縮資料無法正常載入!!)

相關文章