2.pak的组成和加载过程
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可以直接读取到的位置
参考资料: