这些“Used with,,,”复选框中的每一个都代表(至少)一个额外的着色器,需要为你的材质编译以支持该功能。
如果你使用的材质依赖于switch开关(即static和quality switch -switch参数在运行时编译时不同),对于每种可能的变化,基础材质的着色器permutations数量加倍。
Landscape可能特别麻烦,因为每个component(网格上的方形部分)也会产生独特的permutations。对于大型世界,仅此一项就可以轻松使着色器的数量攀升至数万个。
好的!现在我们知道我们要面对的是什么,让我们看看如何减少引擎需要花费在着色器编译上的时间。
3、检查material的使用设置
创建所有新material时,都会默认开启“Automatically Set Usage in Editor”。这是一件好事。这意味着引擎只会创建你需要的着色器permutations。比如如果你的材质不需要与spline meshes一起使用,则不需要创建着色器permutations来支持该功能。
但是,如果选中这些框,并且将其设置为 true 后,引擎将不会为你取消选中它们。如果你决定不再需要像Niagara 这样的特定用途的permutations,则必须手动打开并取消选中该框。
如果你有一些特别贵的材质,尤其是本身具有大量permutations的主材质,则需要快速查看一下你的材质的使用设置,并确保你只启用了你需要的功能。
4、减少项目设置中的permutations
在你的项目设置中,rendering那一栏有两个部分,称为Shader Permutation Reduction 和Mobile Shader Permutation Reduction 。这是一系列复选框,可让你批量禁用不需要的引擎功能的着色器permutations。这可以显着减少你需要编译的着色器数量。
在此处进行任何更改都需要重新启动编辑器,并且不要忘记将鼠标悬停在工具提示上。你需要确保没有使用依赖于这些着色器的功能,否则 Unreal 会大惊小怪。
5、降低材质的复杂性
根据材质的复杂性,某些着色器的编译时间会比其他着色器更长。比如几十个features和由开关控制若干分支的变化的主材质,将创建了很多 permutations。与由更简单的设置(如unlit material)生成的着色器相比,每个permutations都需要更长的时间来编译。
有时为了让你的游戏中拥有令人惊叹的效果不可避免要很多功能,但请确保你充分利用了每个material。如果你有不使用的功能,请将其删除并节省一些时间。
6、添加更多的Shader Compile Worker
当虚幻引擎运行编译着色器的时,编辑器本身实际上并没有做太多的跑腿工作。这取决于一个称为“Shader Compile Worker”的幕后运行的较小程序的实例。
如果你使用的是 Windows,你将能够在任务管理器中看到它们。如果你的 CPU 有多个线程,你可能能够支持比 Unreal 默认创建的更多的并发着色器编译工作器。你可以导航到Engine\Config\BaseEngine.ini并编辑以下行来添加更多线程,其中 x 是线程数。
NumUnusedShaderCompilingThreads=x
这是一个相对安全的设置。如果你将未使用的着色器编译线程数设置得太高,Unreal 会自动降低它。你可以尽可能地设置它,它不会使用不存在的线程。
7、给Shader Compile Worker设置更高的优先级
抱歉 Mac 和 Linux 用户,这是一个仅限 Windows 的技巧。可能其他操作系统也有类似的功能,但是需要研究一下。
在任务管理器的“Details”中,你会看到默认情况下,与大多数进程一样,你的着色器编译工作器的优先级设置设置为“normal”。将它们全部设置为“above normal”将导致 Windows 将更多系统资源分配给它们,用来加快它们通过着色器队列的速度。
你可能会想要直接设置为“High”,但是我建议不要这样做。这可以使它们与保持计算机正常运行所需的其他程序具有同等的优先级,但是可能导致大量速度减慢并可能使编辑器和/或计算机崩溃。
8、最小化编辑器开销
虚幻引擎的着色器编译器使用异步流系统,它会将要编译的着色器排队,并在你工作时逐一处理它们。这有时很有用,因为它允许开发不间断地继续,但是如果你希望你的着色器编译得尽可能快并且不碍事,它就没有那么有用了。
虚幻编辑器本身会对你的系统资源造成很大负担,即使你什么都不做。这意味着你的 CPU 的很大一部分(有时高达 80%,即使在空闲时也是如此!)只是忙于管理编辑器。这并没有为着Shader Compile Worker留下太多空间来做他们的事情。
确保编辑器不是活动窗口会有所帮助,因为 Unreal 在未聚焦时会自动使用较少的系统资源(如果你选择simulating your game,你会注意到 fps 会显着下降)。
如果你想继续工作,你仍然可以通过按Ctrl+R关闭视口中的实时预览来节省一些时间。
我用这种技术得到了有好有坏的结果,但其他人发现将编辑器的优先级设置为“低”也有很大帮助。
9、升级硬件
如果你已经完成了所有其他工作,但仍然对着色器队列的运行速度不满意,那么可能是时候考虑升级你的硬件了。
在运行时,着色器是使用计算机的 GPU 或图形处理单元计算的——但这不是我们想要的。着色器编译几乎完全依赖于你的中央处理单元或 CPU。如果你想升级你的装备,那就先升级处理器或者CPU吧。(虽然也强烈推荐使用 SSD!)
Compiler Booster
这不是一个真正提高编译速度的方法或者技巧(这可能是一个广告)。如果你前往 Unreal Marketplace,你会发现一个名为Compiler Booster的引擎插件,由Corentin Guillaum 制作。
Compiler booster 提供了一个易于访问的界面,可让你从编辑器中设置 Shader Compile 工作线程优先级。这包括一个复选框,启用后,它将在每个工作人员可用时自动设置其优先级,因此你无需每次都深入任务管理器。它还具有一个巨大的重置按钮形式的安全网,如果你的计算机开始紧张并且你需要恢复一些性能,你可以点击该按钮。
这个插件是一个很棒的节省时间的插件,但要清楚;Compiler Booster 不会做任何事情,只是按照本文中列出的步骤自己完成。也就是说,它的价格为 5.99 美元,价格低廉,并且可以自动化编译过程中繁琐的部分。
它有一些可以改进的用户体验。例如,你的设置不会保存在任何地方,因此如果你重新启动编辑器,或者如果你关闭 Compiler Booster 窗口(最小化可以),它们将需要重置。
再次抱歉 Mac 和 Linux 用户,Compiler Booster 仅适用于 Windows。
– End –