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文件在游戏启动的时候,会全部自动"挂载"

什么叫挂载?

代码里面叫做MountMount 是一个有别与Load的概念,Mount是读取pak文件中的文件信息,就是获取pak文件中有哪些文件,以便后续查找文件的时候,确定pak中是否有指定的文件。

什么时候挂载?

app启动的时候,在LaunchEngineLoop中的PreInit函数中,会调用FPakPlatformFile::MountAllPakFiles("Game/Content/Paks/") 。这个函数就是Paks下面所有的pak文件并遍历挂载。

2. 多个Pak如何决定加载及搜索顺序?

引擎内部维护一个已经挂载的pak文件列表,当需要打开其中的文件的时候,会遍历这些pak中的文件列表,查看该pak是否包含该文件,如果包含,则认为该文件包含在改pak中。

这个文件搜索方法表面:

  1. apk文件列表决定了查找顺序。
  2. 如果多个pak都包含某个文件,则肯定使用顺序在前的pak

3. pak文件名可以控制读取顺序

那么这个pak文件列表中的顺序是如何来决定的呢?阅读代码我们会发现,它使用一个ReadOrder的字段来排序,Order越大,就排在前面,Order一样,则默认按文件名排序。这个ReadOrder有以下规则:

  1. Paks文件夹中,并已游戏名开头的文件起始Order为4;Content目录Order为 3 。如果paks文件夹中pak的文件名不是以游戏名为开头,则会满足Content这个条件。

  2. Engine目录下的pak文件Order为2,游戏的用户存储目录则为1,其他为0 。
    文件夹自身的优先级逻辑如下:

    int32 FPakPlatformFile::GetPakOrderFromPakFilePath(const FString& PakFilePath)
    {
         
    if (PakFilePath.StartsWith(FString:
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值