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可以直接读取到的位置
 
 
参考资料:
 
原文地址:https://www.cnblogs.com/Archimedes/p/15525205.html