2.pak的組成和加載過程


pak包含什么
pak文件像是zip壓縮包,包含了游戲資源文件,如 uasset、umap;以及非資源文件,如 .txt、.json。
除了這些文件本身,還要有對文件信息的記錄,不僅是pak信息,還有包含文件的信息。
  1. FPakInfo記錄了pak的信息,如是否加密、密鑰、版本號等
  2. FPakEntry記錄了pak中每個文件的信息,如壓縮信息,文件大小,哈希值等
pak的序列化
  1. 首先要放入資源及非資源文件,這一步可以進行壓縮(可選)。
  2. 填充FPakInputPair對象數據,FPakInputPair中包含路徑字符串和FPakEntry,路徑名用來索引文件,FPakEntry包含該文件基本信息。這一步用的是通過 PrepareCopyFileToPak函數完成,如果上一步有進行壓縮,則使用類似的PrepareCopyCompressedFileToPak完成
  3. 對文件內容進行加密(可選), 最后計算文件內容的hash值
  4. 將FPakEntry的數據寫入pak文件,再寫入文件內容,pak文件所要包含的兩部分內容已經填充完成。
  5. 再依次寫入掛載點MountPoint,為后續掛載過程提供目標地址。 以及寫入存儲在pak中的文件數量。對於每個pak中的文件,要分別寫入文件路徑名和FPakEntry的數據。最后寫入FPakInfo的內容。
最終整個pak文件的序列化結構如下:
pak文件
{
    [
        (FPakEntry)
        [
            文件偏移
            文件大小
            解壓后大小
            壓縮方式
            時間戳(可選,根據Version來決定)
            Hash(驗證文件是否被修改)
            壓縮塊(如果啟用了壓縮的話)
            標記(可選,根據Version來決定。標記是否加密,是否刪除)
            壓縮塊大小(可選,根據Version來決定)
        ]

        文件內容
    ]
    MountPoint
    文件數量
    [
        文件名
        (FPakEntry)(同上)
    ]
    (FPakInfo)
    [
        密鑰
        加密標記
        魔數
        版本號
        Pak索引內容的偏移(所有的PakEntry序列化后,也即MountPoint在pak文件中的位置)
        Pak索引內容的大小(索引內容是從MountPoint到密鑰之前的數據)
        Pak索引內容的Hash
    ]
}
加載pak前的掛載
 
引擎加載pak包時會在一下目錄中搜索.pak文件:
[Demo]/Content/Paks/"
[Demo]/Saved/Paks/"
Engine/Content/Paks/"
 
pak包的加載要通過掛載完成,就是先保存該資源所在的路徑,再通過路徑將資源加載到內存中。一些關鍵詞:
掛載(Mount):保存資源的路徑,加載時就通過該路徑找到資源
加載(Load):將資源加載到內存,注意必須先掛載才能加載
掛載點(MountPoint):即將文件虛擬的掛載到某個路徑上,在UE4中即為/Game可以直接讀取到的位置
 
 
參考資料:
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM