patch中的删除标记

官方技术团队你们好,

我们的项目使用了引擎默认就开启的IoStore功能,目前在打patch时遇到了一个删除标记的问题。

<br/>

先简单介绍下我们打patch的主要流程:

  1. 打基础包时进行一次完整的UE打包流程,根据打包产生的response files找到对应cook后的资产,计算其大小和hash,整合到一个文件清单中。
  2. 打patch时也进行一次完整的UE打包流程,同样得到一个文件清单。
  3. 对比基础包和patch的文件清单,得出差异文件列表。
  4. 对差异文件列表中的资产进行分类(参照UE源码),并分别生成PakList_*.txt和PakListIoStore_*.txt。
  5. 调用UnrealPak生成pak和IoStore。

<br/>

我们先打了一个基础包,之后删除了某个贴图目录下的一些贴图资产。由于贴图资产是需要划入PakListIoStore_*.txt中的,因此我们在PakListIoStore_*.txt中对被删除的资产加了-delete标记,

比如:“../../../MyProject/Content/Textures/A02.uasset” -delete

这样就打不出patch包,会报错:LogIoStore: Error: Invalid line in response file ‘“../../../MyProject/Content/Textures/A02.uasset” -delete’.

如果在PakList_*.txt中添加上述删除标记的话,虽然可以打出patch但挂载后​依然可以调用UE加载接口加载被删除的贴图。

<br/>

后来研究了下发现:

  1. PAK 有显式 delete record;IoStore 这条链路没有同款 delete record。也就说删除标记仅对进入PakList_*.txt的资产有效,IoStore不支持删除标记。
  2. 除此之外,PAK 的 delete record 运行时生效条件不是只看路径,还看 同一个 PakchunkIndex。比如贴图A一开始被划入了chunk10,那么需要保证生成的Patch的pak文件名也必须有pakchunk10字样,比如叫pakchunk10_10001_P.pak(10001为版本号)可以,叫patch_10001_P.pak就不行。

<br/>

我想问在当前启用IoStore机制的情况下,如何才能做到对patch标记资产已被删除,确保无法加载到被删除的资产。如果是未支持的功能,是否有开发计划。

<br/>

谢谢!

[Attachment Removed]

您好,明确了一下当前iostore确实没有delete路径。这是由于pak和store存储方式不一样导致的,因此没有​这个功能。

我想了几个方案您可以考虑一下:

A. 空壳覆盖,零引擎改动, 不要删文件,改成用占位的资产覆盖。

B. 使用CoreRedirect机制,将包重定向​到一个不存在的包,但是代码上需要做一点修改(CL#56851537)

[Attachment Removed]