UE4中Pak文件的读取规则
本文鏈接 https://blog.csdn.net/BDalasja/article/details/95618330
最近項目轉戰UE4了,需要研究UE4的熱更,就此研究了一下PAK文件的相關內容。
pak文件是UE打包后的一種文件格式,所有的資源文件都是存儲在這個文件中。我們在打包后的項目下,可以發現 content目錄下有一個Paks目錄,目錄中一般會有一個pak文件和一個sig文件。既然叫Paks,說明肯定會有多個pak文件。以堡壘之夜為例,可以看到Paks目錄下有40+的pak文件。那么這些pak文件是怎么組織的?引擎是怎么知道哪個文件在哪個pak文件中的?多個pak文件中如果同時有某個資源(熱更的情況),又是如何處理覆蓋關系?
1. Paks中的pak文件在游戲啟動的時候,會全部自動"掛載"
什么叫掛載?
代碼里面叫做Mount 。Mount 是一個有別與Load的概念,Mount是讀取pak文件中的文件信息,就是獲取pak文件中有哪些文件,以便后續查找文件的時候,確定pak中是否有指定的文件。
什么時候掛載?
app啟動的時候,在LaunchEngineLoop中的PreInit函數中,會調用FPakPlatformFile::MountAllPakFiles("Game/Content/Paks/") 。這個函數就是Paks下面所有的pak文件并遍歷掛載。
2. 多個Pak如何決定加載及搜索順序?
引擎內部維護一個已經掛載的pak文件列表,當需要打開其中的文件的時候,會遍歷這些pak中的文件列表,查看該pak是否包含該文件,如果包含,則認為該文件包含在改pak中。
這個文件搜索方法表面:
3. pak文件名可以控制讀取順序
那么這個pak文件列表中的順序是如何來決定的呢?閱讀代碼我們會發現,它使用一個ReadOrder的字段來排序,Order越大,就排在前面,Order一樣,則默認按文件名排序。這個ReadOrder有以下規則:
Paks文件夾中,并已游戲名開頭的文件起始Order為4;Content目錄Order為 3 。如果paks文件夾中pak的文件名不是以游戲名為開頭,則會滿足Content這個條件。
Engine目錄下的pak文件Order為2,游戲的用戶存儲目錄則為1,其他為0 。
文件夾自身的優先級邏輯如下:
在前兩條規則的基礎上,文件名以_P.pak 為結尾的,享有額外Order。額外Order最低100。如果結尾形如_n_P.pak 其中n是數字,則會再額外得到 n乘以100的Order值。 例如 _2_P.pak 則額外Order為 300 。
// 如果文件名以 "_P.pak" 結束 if (PakFilename.EndsWith(TEXT("_P.pak"))) {uint32 ChunkVersionNumber = 1;FString StrippedPakFilename = PakFilename.LeftChop(6);// 倒著檢測,看_P.pak 前面有沒有 _n 結構int32 VersionEndIndex = PakFilename.Find("_", ESearchCase::CaseSensitive, ESearchDir::FromEnd);if (VersionEndIndex != INDEX_NONE && VersionEndIndex > 0){int32 VersionStartIndex = PakFilename.Find("_", ESearchCase::CaseSensitive, ESearchDir::FromEnd, VersionEndIndex - 1);if (VersionStartIndex != INDEX_NONE){VersionStartIndex++;FString VersionString = PakFilename.Mid(VersionStartIndex, VersionEndIndex - VersionStartIndex);if (VersionString.IsNumeric()){// 如果有數字并大于1 則認為這個數字是一個Version;為了保證基礎100的Order,這里會額外 +1int32 ChunkVersionSigned = FCString::Atoi(*VersionString);if (ChunkVersionSigned >= 1){ChunkVersionNumber = (uint32)ChunkVersionSigned + 1;}}}}// 計算OrderPakOrder += 100 * ChunkVersionNumber; }結論
通過上面的內容我們可以得出結論:
這幾個結論,可以推到出一個新的話題,那就是熱更。通過下載新的pak,并控制搜索順序,則可以很容易“屏蔽”老pak中的資源文件。當然這個新的pak需要一定規則生成,是一個補丁包,不是完整pak包。好在UE本身就提供差異修改打patch的工具, 下一篇我們就來討論一下UE4的patch熱更方案。 UE4 版本Patch方案
總結
以上是生活随笔為你收集整理的UE4中Pak文件的读取规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Peer-To-Peer 综述(P2P技
- 下一篇: 澳大利亚:令人钦羡的高福利国家 - 老牛