大纲
- 引言
- pak文件是什么?
- 创建pak
- pak文件的序列化格式
- 运行时挂载pak文件
- pak加载文件优先级
- pak优先级的计算
- MountPoint的计算
- 运行时设置MountPoint
- MountPoint有什么用?
- Pak索引结构
- 从pak中加载文件
引言
我们的项目在上一个版本中,在UE4的资源处理方面踩了不少坑。因此特意花了些时间去学习和研究了一下,主要是pak文件方面的内容,希望能帮助大家更好的了解,也起到一个抛砖引玉的作用。
由于本人也接触UE4不久,如有错误或遗漏的地方,望不吝指出。
本文基于UE4 4.24版本。
pak文件是什么?
以我个人的观点,pak文件和zip文件十分类似。UE4将多个文件合并添加到一个文件中,这个文件就是pak。
我们不仅仅能够将UE4自身的资源文件,如uasset、umap等添加到pak文件中,还能够将非资源文件,如.txt、.json等添加到pak中:
在pak文件中,除了所添加的每个文件的内容外,还会包含一些其他信息:如pak文件是否加密,使用的密钥等等。
创建pak
UE4提供了UnrealPak.exe来创建pak文件,有许多参数可供使用:
在我们生成项目时,如果选择了Use Pak File,如下图所示:
那么Cook的所有资源都会被放入一个独立的pak文件中,位于项目生成路径下的ProjectName/Content/Paks文件夹中(其中ProjectName是项目的名称),否则,生成的项目中包含的都是零散独立的资源。流程如图所示:
pak文件的序列化格式
在了解pak文件的序列化格式之前,需要先了解2个数据结构,分别是FPakInfo以及FPakEntry:
其中FPakInfo中会记录pak文件的一些信息,比如是否加密、密钥、版本号等等。而FPakEntry则用于存储在pak中的文件,每个文件对应一个FPakEntry。
在生成pak时,针对每个需要写入的文件,如果该文件需要压缩的话,则会先进行压缩操作。接着,根据是否压缩,会有名为PrepareCopyFileToPak或PrepareCopyCompressedFileToPak的函数来处理数据(这里以PrepareCopyFileToPak函数来进行说明,PrepareCopyCompressedFileToPak函数十分类似,只不过处理的是压缩后的文件内容)。
PrepareCopyFileToPak函数会填充FPakInputPair对象数据,FPak