UE4 Cook一致性实践

Cook 的一致性就是保证在资源不变的情况下,多次 Cook 或者在不同的机器上 Cook,所得到的结果都应该是一致的。但是实际开发过程中总是存在一些问题会导致不一致的情况发生。以下是总结的一些实践,可以最大化保证 Cook 的一致性。

UE4 Bug

这个问题之前提到过 bIsUObjectWrapper 没有正确初始化导致 Cook 不一致 ,这个问题在 4.27 中已经修复,其他版本需要自己手动修复一下,具体提交列表如下

编辑器语言设置

如果编辑器的语言设置不一样,会导致不一样的 Cook 结果

editor-language.png

原因是因为 Cook 的时候会序列化 Package 中的 FNames,有些 FName 会受到本地化的影响,从而得出不一样的结果,如

temporary-node.png

在不同的编辑器语言设置下,这个 TempPinCategory 本地化的结果不一样,在 English 下是 Temp_,在中文下是 __,因此就导致 Cook 后的结果不一致,如图

temp-localized_1.png

temp-localized_2.png

因此,要确保构建环境使用一致的编辑器语言,如果构建机集群是通过 CI/CD 环境调度的,可以在构建脚本中确保每次构建先设置一下构建机上的编辑器语言,方法是修改配置文件 Engine/Saved/Config/[Windows 或 Mac]/EditorSettings.ini 中的以下配置

[Internationalization]
Locale=en
Language=en

Shared DDC 配置

配置所有的构建机使用同一份 DDC,也有助于保证 Cook 的一致性。因为如果没有配置 Shared DDC,每个构建机都使用自己本地生成的 DDC,如果生成 DDC 不一致或者没有及时更新(直接修改 C++ 代码,但是没有重新保存对应的资源,也不会触发 DDC 的更新),也会导致 Cook 不一致

Shared DDC 配置官方文档

可以使用脚本定期重新生成 Shared DDC,命令如下

Windows

[Path to Engine Binaries]\Win64\UE4Editor-Cmd.exe [Your .uproject file path] -run=DerivedDataCache -fill

Mac

[Path to Engine Binaries]/Mac/UE4Editor.app/Contents/MacOS/UE4Editor [Your .uproject file path] -run=DerivedDataCache -fill

Perforce 路径大小写问题

如果项目使用 Perforce 版控,要注意运行在 Linux 下的 P4 服务器是支持文件路径大小写敏感的,也就是说允许存在同名的大小写不一致的路径

p4s-case.png

具体可参考官方文档: Case Sensitivity

但是大部分的开发环境都是 Windows 的,Windows 的文件路径是大小写不敏感的,因此就造成一个问题,就是本地的路径大小写可能会与库里不一致,各个构建机里的同名文件路径大小写可能不一致(曾经修改过路径中的大小写的文件),在 Cook 时因为包名 FName 的序列化,也会导致 Cook 后的结果不一致

  • 库里路径

    online_depot.png

  • 构建机A

    online_lower.png

  • 构建机B

    online_upper.png

Cook 结果差异

case_diff_1.png

case_diff_2.png

解决方法

最好的解决方法是让 P4 服务器运行在大小写不敏感在状态下,并且检查构建机上的文件路径,确保路径与库里一致

Switching Perforce server case sensitive mode