UE4 Cook一致性实践
Cook 的一致性就是保证在资源不变的情况下,多次 Cook 或者在不同的机器上 Cook,所得到的结果都应该是一致的。但是实际开发过程中总是存在一些问题会导致不一致的情况发生。以下是总结的一些实践,可以最大化保证 Cook 的一致性。
UE4 Bug
这个问题之前提到过 bIsUObjectWrapper 没有正确初始化导致 Cook 不一致 ,这个问题在 4.27 中已经修复,其他版本需要自己手动修复一下,具体提交列表如下
- Fix UEdGraphPin::bIsUObjectWrapper not being initialized in some contructors, not being considered for ==, or being reset to defaulst.
- Restore non-determinism fix without the == change which caused some systems, namely niagara, to have errors
- Fix up pins that were saved with bIsUObjectWrapperBool incorrectly set to true
- Remove “bIsUObjectWrapper == Other.bIsUObjectWrapper” from comparis on as it’s causing issues in Niagara
编辑器语言设置
如果编辑器的语言设置不一样,会导致不一样的 Cook 结果
原因是因为 Cook 的时候会序列化 Package 中的 FNames
,有些 FName 会受到本地化的影响,从而得出不一样的结果,如
在不同的编辑器语言设置下,这个 TempPinCategory
本地化的结果不一样,在 English 下是 Temp_
,在中文下是 __
,因此就导致 Cook 后的结果不一致,如图
因此,要确保构建环境使用一致的编辑器语言,如果构建机集群是通过 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,命令如下
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 服务器是支持文件路径大小写敏感的,也就是说允许存在同名的大小写不一致的路径
具体可参考官方文档: Case Sensitivity
但是大部分的开发环境都是 Windows 的,Windows 的文件路径是大小写不敏感的,因此就造成一个问题,就是本地的路径大小写可能会与库里不一致,各个构建机里的同名文件路径大小写可能不一致(曾经修改过路径中的大小写的文件),在 Cook 时因为包名 FName 的序列化,也会导致 Cook 后的结果不一致
-
库里路径
-
构建机A
-
构建机B
Cook 结果差异
解决方法
最好的解决方法是让 P4 服务器运行在大小写不敏感在状态下,并且检查构建机上的文件路径,确保路径与库里一致