找回密码
 立即注册
查看: 773|回复: 12

提升FastBuild编译UnrealEngine的速度

[复制链接]
发表于 2021-12-6 11:44 | 显示全部楼层 |阅读模式
在上一篇文章之后我进行了进一步测试,下面是结果。
测试结果

测试配置: i7-8700 3.2Ghz 12线程 16GB内存 WDC PC SN730 SDBQNTY-256G-1001 固态硬盘 ST1000DM003-1SB102 机械硬盘
服务器配置: Inter Xeon Silver 4114 2.2GHz (2处理器)40线程 64GB内存
引擎版本4.27.0 Release 网络:百兆网络
引擎放在机械硬盘




总共花费时间与编译量:
1>[2328/2328] UnrealBuildTool.exe UE4Editor.target
1>Total time in FASTBuild executor: 8160.80 seconds
1>Total execution time: 8501.83 seconds141min
引擎放在机械硬盘并禁用插件



总共花费时间与编译量:
3>[1000/1000] UnrealBuildTool.exe UEToonRenderingEditor.target
3>Total time in FASTBuild executor: 3765.71 seconds
3>Total execution time: 3902.75 seconds65min
这里我额外测试了一下开启ForceRemote的情况:


3>[1000/1000] UnrealBuildTool.exe UEToonRenderingEditor.target
3>Total time in FASTBuild executor: 4508.08 seconds
3>Total execution time: 4708.38 seconds78min
引擎放在固态硬盘并禁用插件

因为将引擎从机械硬盘移动到固态硬盘,中间删除了一些东西导致引擎多编译了一些,实际时间要比测试的要短3~8min。


3>[1006/1006] UnrealBuildTool.exe UEToonRenderingEditor.target
3>Total time in FASTBuild executor: 2478.80 seconds
3>Total execution time: 2584.69 seconds43min
猜想与总结

首先FastBuild的大致编译流程为分发编译任务=》远程机编译完之后下载obj文件=》所有编译任务完成后在本地进行链接并且生成对应文件。了解此我们才能对瓶颈进行分析。

  • 远程机经常“偷懒”:本人在测试中发现远程机在编译时经常“偷懒”,且该阶段下内存、网络经常处于满负荷状态。因此本人认为这是因为没有使用千兆网络,下载时间过场而导致这种情况的产生。
  • 任务显示超时:在编译过程中,远程机有时会出现超时的情况,个人猜测可能是因为动用了所有核心编译,导致网络连接的心跳检测失败而导致的。
基于以上结果我认为以下方法可以提升编译速度,影响程度由高到低排列如下:

  • 在uproject文件中禁用不必要插件。
  • 将源码放在固态硬盘中。
  • 使用千兆网络,而非百兆。(预计能加快5min)
  • 使用缓存模式。
在uproject文件中禁用不必要插件

直接在插件管理界面中禁用插件即可。也可以直接将禁用的列表复制到uproject文件中。本人禁用的插件如下:
"Plugins": [
    {
        "Name": "AlembicImporter",
        "Enabled": false
    },
    {
        "Name": "AppleMoviePlayer",
        "Enabled": false
    },
    {
        "Name": "AppleImageUtils",
        "Enabled": false
    },
    {
        "Name": "OnlineSubsystemGooglePlay",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Android"
        ]
    },
    {
        "Name": "AndroidPermission",
        "Enabled": false
    },
    {
        "Name": "AndroidMoviePlayer",
        "Enabled": false
    },
    {
        "Name": "AndroidMedia",
        "Enabled": false
    },
    {
        "Name": "AndroidDeviceProfileSelector",
        "Enabled": false
    },
    {
        "Name": "AudioCapture",
        "Enabled": false
    },
    {
        "Name": "AutomationUtils",
        "Enabled": false
    },
    {
        "Name": "AvfMedia",
        "Enabled": false
    },
    {
        "Name": "ChaosClothEditor",
        "Enabled": false
    },
    {
        "Name": "ChaosCloth",
        "Enabled": false
    },
    {
        "Name": "ChaosEditor",
        "Enabled": false
    },
    {
        "Name": "ChaosNiagara",
        "Enabled": false
    },
    {
        "Name": "ChaosSolverPlugin",
        "Enabled": false
    },
    {
        "Name": "CodeLiteSourceCodeAccess",
        "Enabled": false
    },
    {
        "Name": "CLionSourceCodeAccess",
        "Enabled": false
    },
    {
        "Name": "Paper2D",
        "Enabled": false
    },
    {
        "Name": "GooglePAD",
        "Enabled": false
    },
    {
        "Name": "MagicLeapMedia",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Lumin"
        ]
    },
    {
        "Name": "MagicLeap",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Lumin",
            "Mac",
            "Win64"
        ]
    },
    {
        "Name": "MagicLeapPassableWorld",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Lumin",
            "Mac",
            "Win64"
        ]
    },
    {
        "Name": "OpenImageDenoise",
        "Enabled": false
    },
    {
        "Name": "IOSDeviceProfileSelector",
        "Enabled": false
    },
    {
        "Name": "LinuxDeviceProfileSelector",
        "Enabled": false
    },
    {
        "Name": "CharacterAI",
        "Enabled": false
    },
    {
        "Name": "DatasmithContent",
        "Enabled": false
    },
    {
        "Name": "GeometryCache",
        "Enabled": false
    },
    {
        "Name": "SpeedTreeImporter",
        "Enabled": false
    },
    {
        "Name": "LuminPlatformFeatures",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Lumin"
        ]
    },
    {
        "Name": "MLSDK",
        "Enabled": false
    },
    {
        "Name": "WmfMedia",
        "Enabled": false
    },
    {
        "Name": "WebMMoviePlayer",
        "Enabled": false
    },
    {
        "Name": "MediaCompositing",
        "Enabled": false
    },
    {
        "Name": "ImgMedia",
        "Enabled": false
    },
    {
        "Name": "OnlineSubsystemNull",
        "Enabled": false
    },
    {
        "Name": "OnlineSubsystemUtils",
        "Enabled": false
    },
    {
        "Name": "OnlineSubsystemIOS",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "IOS",
            "TVOS"
        ]
    },
    {
        "Name": "ChunkDownloader",
        "Enabled": false
    },
    {
        "Name": "OnlineSubsystem",
        "Enabled": false
    },
    {
        "Name": "XCodeSourceCodeAccess",
        "Enabled": false
    },
    {
        "Name": "EditableMesh",
        "Enabled": false
    },
    {
        "Name": "PerforceSourceControl",
        "Enabled": false
    },
    {
        "Name": "PlasticSourceControl",
        "Enabled": false
    },
    {
        "Name": "SubversionSourceControl",
        "Enabled": false
    },
    {
        "Name": "SteamVR",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Win32",
            "Win64",
            "Linux"
        ]
    },
    {
        "Name": "OpenXRHandTracking",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Win32",
            "Win64",
            "Linux",
            "HoloLens",
            "Android"
        ]
    },
    {
        "Name": "OpenXREyeTracker",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Win32",
            "Win64",
            "Linux",
            "HoloLens",
            "Android"
        ]
    },
    {
        "Name": "OpenXR",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Win32",
            "Win64",
            "Linux",
            "Android",
            "HoloLens"
        ]
    },
    {
        "Name": "OculusVR",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "Win32",
            "Win64",
            "Android"
        ]
    },
    {
        "Name": "EnvironmentQueryEditor",
        "Enabled": false
    },
    {
        "Name": "AISupport",
        "Enabled": false
    },
    {
        "Name": "Synthesis",
        "Enabled": false
    },
    {
        "Name": "MotoSynth",
        "Enabled": false
    },
    {
        "Name": "SoundFields",
        "Enabled": false
    },
    {
        "Name": "LocationServicesBPLibrary",
        "Enabled": false
    },
    {
        "Name": "XGEController",
        "Enabled": false
    },
    {
        "Name": "OodleData",
        "Enabled": false
    },
    {
        "Name": "OodleNetwork",
        "Enabled": false
    },
    {
        "Name": "TextureFormatOodle",
        "Enabled": false
    },
    {
        "Name": "ExampleDeviceProfileSelector",
        "Enabled": false
    },
    {
        "Name": "GeometryMode",
        "Enabled": false
    },
    {
        "Name": "MeshPainting",
        "Enabled": false
    },
    {
        "Name": "TcpMessaging",
        "Enabled": false
    },
    {
        "Name": "UdpMessaging",
        "Enabled": false
    },
    {
        "Name": "MacGraphicsSwitching",
        "Enabled": false
    },
    {
        "Name": "MobileLauncherProfileWizard",
        "Enabled": false
    },
    {
        "Name": "PlatformCrypto",
        "Enabled": false
    },
    {
        "Name": "MobilePatchingUtils",
        "Enabled": false
    },
    {
        "Name": "WindowsMoviePlayer",
        "Enabled": false
    },
    {
        "Name": "GoogleCloudMessaging",
        "Enabled": false
    },
    {
        "Name": "PhysXVehicles",
        "Enabled": false
    },
    {
        "Name": "NullSourceCodeAccess",
        "Enabled": false
    },
    {
        "Name": "FacialAnimation",
        "Enabled": false
    },
    {
        "Name": "PostSplashScreen",
        "Enabled": false,
        "SupportedTargetPlatforms": [
            "XboxOne"
        ]
    },
    {
        "Name": "KDevelopSourceCodeAccess",
        "Enabled": false
    },
    {
        "Name": "MatineeToLevelSequence",
        "Enabled": false
    },
    {
        "Name": "MediaPlayerEditor",
        "Enabled": false
    },
    {
        "Name": "VisualStudioCodeSourceCodeAccess",
        "Enabled": false
    }
]其实还可以禁用更多的插件,我在测试的时候没有全部禁用。 除了可以减少编译量,以节约时间外。同时也可以减少编译完之后所占用的空间。占用空间165G=>108G。
使用缓存模式

经过测试仅仅是将bEnableCaching设置为true好像是不能开启缓存模式的。应该还需要设置CacheMode。在源码中CacheMode分别为ReadWrite、ReadOnly、WriteOnly,枚举对应的值依次为0,1,2。因为缓存模式适用于多人引擎团队,对于我这种独狼爱好者来说意义不大,所以就没测试。有兴趣的可以自己跟一下UBT的代码。
<FASTBuild>
    <bEnableCaching>true</bEnableCaching>
    <CacheMode>0</CacheMode>
</FASTBuild>本地核心控制

在编译UE4时FastBuildWorker.exe无法控制本地使用核心数。如果你不想占用本地资源可以将bForceRemote设置为true,引擎编译过程中就不会占用本地核心了(开头还是会使用一些,以及Link阶段只能进行)。
如果只想让本地不会卡死,则可以使用一下参数:
<LocalExecutor>
    <ProcessorCountMultiplier>0.9</ProcessorCountMultiplier>
    <MaxProcessorCount>11</MaxProcessorCount>
</LocalExecutor>
<ParallelExecutor>
    <ProcessorCountMultiplier>0.9</ProcessorCountMultiplier>
    <MaxProcessorCount>11</MaxProcessorCount>
</ParallelExecutor>本人测试结果,不设置MaxProcessorCount是不行的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-12-6 11:52 | 显示全部楼层
有猜完增量编译的坑吗?上次踩4.26的,发现改了好多,就没碰了。
发表于 2021-12-6 11:53 | 显示全部楼层
5950x全重编译15分钟搞定。
发表于 2021-12-6 12:01 | 显示全部楼层
能具体说一下么?我还没踩呢
发表于 2021-12-6 12:09 | 显示全部楼层
上半年踩得是4.22版本的, 联机编译, 着色器, 增量编译, VS版本等等, 踩了不上问题, 这些除了增量编译外, 4.26高版本没有什么变化, 都好处理
增量编译这块是按照GitHub - Ronsenval/UnrealEngineCompilationUsingFastBuild: Compile Unreal Engine 4.22 using FastBuild踩得坑, 用的是Report解决的依赖关系, 不是cl-filter.exe

这个版本4.22微调些编译报错, 然后改下fastbuild的源码, 将生成报表文件时Html语法删除很多, 减少Report输出, 最后读Report分析的时候, 性能要再快个三分之一以上.

最后结果比正常编译快一些, 两台机器性能配置一样的机器, 最后编译性能约1.5倍吧.

但4.26还用Report这种写法, 要改一些FastBuild.cs文件里面东西, 报错蛮多的
切换用cl-filter.exe的话, 也要改不少, 没有找到任何增量编译的成功案例

能搜索到的资料什么都是有问题的, 嗯, 就是看起来正常, 正真生产环境一布, 都是问题...

最后4.26的增量编译没折腾了, 预计折腾得一两周, 没那个精力
(根本原因是提升不大, 不用源码版编译, 正常代码量还好, 主要要他的联机编译着色功能, 这个实际省下了很多时间)
发表于 2021-12-6 12:18 | 显示全部楼层
然后就是, 联机编译的提升, 不是源码版, 真的没必要, 提升不如放到固态, 换个好点的CPU, 或者调整下代码的前置依赖什么的, 最后还要受网络的限制, 麻烦的很
// FastBuild的缓存也是个坑, 不开增量编译, 用它的缓存也行, 吃一块服务器硬盘, 读写速度... 最后提升还是不大

源码版的话, 没这个需求.

嗯, 这个, 看实际情况吧, 不用源码版, 不推荐踩这个坑, 不值.

[调皮]
发表于 2021-12-6 12:27 | 显示全部楼层
UE4纯属个人爱好,公司垃圾电脑只能将就着用了。我也知道3990x全编译10min就好了
发表于 2021-12-6 12:27 | 显示全部楼层
我没有那么深入研究了,帮不了什么忙
发表于 2021-12-6 12:33 | 显示全部楼层
因为主要还是为了提升学习管线代码效率,特地研究了一下FastBuild
发表于 2021-12-6 12:35 | 显示全部楼层
顺带问问罢了,嗯,现在没有这个需求。只是看看你踩了没有。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-23 12:12 , Processed in 0.104009 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表