|
一、问题
虚幻引擎编译速度一直是独立开发者令人揪心的问题。Windows平台纵然有XGE这种商业解决方案,但是价格不菲。Mac/Linux上一直没有什么好的联合编译软件。
UE从4.26开始支持一款叫FASTBuild的联合编译软件,已经集成在UE中,引擎中路径如下\Engine\Extras\ThirdPartyNotUE\FASTBuild\。
先讲UE做了什么改动,再讲测试结果,最后说明一下FASTBuild联合编译无法落地的原因。
二、UE 魔改
UE4.26魔改了FASTBuild v0.99版本(2019年发布),添加了一个端口监听服务FASTBuildCoordinator.exe,用来更方便的注册上线/下线的工作机。使用方式是在局域网单一台主机上打开监听服务,然后其余主机设置环境变量FASTBUILD_COORDINATOR 等于那台机器的局域网IP。然后工作机的注册就可以自动进行了,不需要更多配置。
FASTBUILD对于注册工作机,原来的逻辑是在某个共享文件下(环境变量FASTBUILD_BROKERAGE_PATH),写入名为局域网IP地址的文件。工作机上/下线,会生成/销毁对应文件。可能UE觉得这个方法不太适合它们。我用下里觉得没问题。
然而,对于接下来要讲的FASTbuild分布式编译的问题,UE也没有去解决。所以到了UE5时,对FASTbuild的支持依然停留在那个早前的版本。估计时UE也发现了FASTbuild的这个问题,但是没心思去解决吧。
三、完整编译Editor耗时
配置UE5联合编译请参考:保姆式教你使用FASTBuild对UE4进行联机编译 - 知乎 (zhihu.com)
PS : UE5已经配置了FastBuild相关的Graph Executor,上文中手撸的.cs代码可以无视。同时修改了一下FASTBuild和FASTBuildDashboard(GUI)的源码,更容易上手[1][2]
--- Summary -----------------------------------------------------
/----- Cache -----\
Build: Seen Built Hit Miss Store CPU
- Exec : 2843 2838 - - - 1h:33m 30.420s
- File : 67312 2685 - - - 0.045s
- Object : 2704 2703 0 2704 0 21h:39m 19.945s
- Alias : 1 0 - - - 0.000s
- Compiler : 1 1 - - - 0.087s
- ObjectList : 2704 2703 - - - 0.000s
Cache:
- Hits : 0 (0.0 %)
- Misses : 2704
- Stores : 0
Time:
- Real : 1h:27m 39.417s
- Local CPU : 23h:12m 50.492s (15.9:1)
- Remote CPU : 1 days, 20h:56m 33.047s (30.8:1)
-----------------------------------------------------------------16 + 32 核心 : 1小时27分钟
--- Summary -----------------------------------------------------
/----- Cache -----\
Build: Seen Built Hit Miss Store CPU
- Exec : 3025 3025 - - - 1h:43m 21.568s
- File : 67852 2813 - - - 0.100s
- Object : 2836 2836 0 2836 0 2 days, 22h:9m 45.859s
- Alias : 1 1 - - - 0.000s
- Compiler : 1 1 - - - 0.031s
- ObjectList : 2836 2836 - - - 0.000s
Cache:
- Hits : 0 (0.0 %)
- Misses : 2836
- Stores : 0
Time:
- Real : 4h:31m 46.910s
- Local CPU : 2 days, 23h:53m 7.547s (15.9:1)
- Remote CPU : 0.000s (0.0:1)
-----------------------------------------------------------------16 核心 : 4小时31分钟
--- Summary -----------------------------------------------------
/----- Cache -----\
Build: Seen Built Hit Miss Store CPU
- Exec : 3083 3078 - - - 3h:7m 35.915s
- File : 70484 2975 - - - 0.050s
- Object : 2998 2997 0 2998 0 2 days, 13h:6m 32.078s
- Alias : 1 0 - - - 0.000s
- Compiler : 1 1 - - - 0.053s
- ObjectList : 2998 2997 - - - 0.000s
Cache:
- Hits : 0 (0.0 %)
- Misses : 2998
- Stores : 0
Time:
- Real : 2h:37.271s
- Local CPU : 2 days, 16h:14m 8.094s (32.0:1)
- Remote CPU : 0.000s (0.0:1)
-----------------------------------------------------------------16 核心 : 2小时37分钟
测试总结:
FASTBuild联合编译与CPU核心数量呈线性关系,符合预期。但是一旦命令行使用了-dist参数,速度反而要比Baseline(即ParallelExecutor和FASTBuildExecturo的单机版)慢了整整3倍,同时峰值内存的消耗是原来的2倍(最高大约在~90G/128G)。
CPU数量 | 耗时 (UE5编辑器完整编译) | 是否联合编译 | 16逻辑核心 | 4小时31分 | 是(但是只有本机一个worker) | 32逻辑核心 | 2小时37分 | 是(但是只有本机一个worker) | 16 + 32 逻辑核心 | 1小时27分 | 是(两个worker) | 16逻辑核心 | 1小时16分 | 否 | 32逻辑核心 | 0小时38分 | 否 | 四、分布式无法开启PCH
浏览了一下Issue,是分布式编译没有开启PCH的缘故:
Building UE 4.24: slower with FASTBuild · Issue #725 · fastbuild/fastbuild (github.com)
Unreal engine integration and PCH usage · Issue #823 · fastbuild/fastbuild (github.com)
试了一下强行让工作机器使用PCH,会报错。同时,如果采取本地编译使用PCH,而工作机使用preprocessor时,工作机返回的结果,作为新的依赖,在本地进行后续编译时,也会报错。
总而言之,开启了分布式编译,PCH就不工作了。作者说ta本地有解决方法,但是需要修改preprocessor,同时ta提到XGE的解决方法是运行了一套虚拟文件系统,而FASTBuild没有这个特性。这两点可能在UE看来,都不如继续使用XGE吧。
五、附录
[1],yhyu13/fastbuild: High performance build system for Windows, OSX and Linux. Supporting caching, network distribution and more. (github.com)
[2],yhyu13/FASTBuild-Dashboard: A GUI for FASTBuild (github.com) |
|