官方技术团队你们好,
我们的项目使用了引擎默认就开启的IoStore功能,目前在打patch时遇到了一个删除标记的问题。
<br/>
先简单介绍下我们打patch的主要流程:
- 打基础包时进行一次完整的UE打包流程,根据打包产生的response files找到对应cook后的资产,计算其大小和hash,整合到一个文件清单中。
- 打patch时也进行一次完整的UE打包流程,同样得到一个文件清单。
- 对比基础包和patch的文件清单,得出差异文件列表。
- 对差异文件列表中的资产进行分类(参照UE源码),并分别生成PakList_*.txt和PakListIoStore_*.txt。
- 调用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/>
后来研究了下发现:
- PAK 有显式 delete record;IoStore 这条链路没有同款 delete record。也就说删除标记仅对进入PakList_*.txt的资产有效,IoStore不支持删除标记。
- 除此之外,PAK 的 delete record 运行时生效条件不是只看路径,还看 同一个 PakchunkIndex。比如贴图A一开始被划入了chunk10,那么需要保证生成的Patch的pak文件名也必须有pakchunk10字样,比如叫pakchunk10_10001_P.pak(10001为版本号)可以,叫patch_10001_P.pak就不行。
<br/>
我想问在当前启用IoStore机制的情况下,如何才能做到对patch标记资产已被删除,确保无法加载到被删除的资产。如果是未支持的功能,是否有开发计划。
<br/>
谢谢!
[Attachment Removed]