pak包含什么
pak文件像是zip壓縮包,包含了游戲資源文件,如 uasset、umap;以及非資源文件,如 .txt、.json。
除了這些文件本身,還要有對文件信息的記錄,不僅是pak信息,還有包含文件的信息。
-
FPakInfo記錄了pak的信息,如是否加密、密鑰、版本號等
-
FPakEntry記錄了pak中每個文件的信息,如壓縮信息,文件大小,哈希值等
pak的序列化
-
首先要放入資源及非資源文件,這一步可以進行壓縮(可選)。
-
填充FPakInputPair對象數據,FPakInputPair中包含路徑字符串和FPakEntry,路徑名用來索引文件,FPakEntry包含該文件基本信息。這一步用的是通過 PrepareCopyFileToPak函數完成,如果上一步有進行壓縮,則使用類似的PrepareCopyCompressedFileToPak完成
-
對文件內容進行加密(可選), 最后計算文件內容的hash值
-
將FPakEntry的數據寫入pak文件,再寫入文件內容,pak文件所要包含的兩部分內容已經填充完成。
-
再依次寫入掛載點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可以直接讀取到的位置
參考資料:
