找回密码
 立即注册
查看: 483|回复: 8

Unreal|加速shader编译的一百种方法

[复制链接]
发表于 2021-11-23 08:14 | 显示全部楼层 |阅读模式


如果你很熟悉在虚幻引擎中工作的话,你就会看到右下角那个闪烁的小条不断地通知你引擎正在compiling shaders编译着色器。根据你在项目中实现材质的方式,你可能有数百或数十万个虚幻引擎认为需要编译的着色器。如果你的机器配置比较高,那可能影响不是很大,但是如果你机器配置低端,那估计每次都得几个小时来编译。
在虚幻编辑器内部和外部,你都可以尝试多种技巧,它们可以显著减少编译着色器所需的时间,或者减少首先需要编译的着色器数量。以下是一百种我发现有用的办法:
1. 检查你的material是否有不必要的设置
2. 减少项目设置中的shaderpermutations
3. 优化material
4. 创建更多的Shader Compile Workers
5. 将你的 Shader Compile Workers 设置为更高的优先级
6. 最小化编辑器开销
100. 升级硬件(最后的手段)
这些技术都经过虚幻引擎社区的尝试和测试,范围从改进处理material pipeline的方式、更改系统赋予虚幻引擎编译工具的优先级,到简单地升级你正在使用的硬件。然而,在我们进入所有这些之前,我们需要知道我们正在处理什么。shader编译可能不方便,但它是虚幻引擎图形管道的重要组成部分。

1什么是着色器
在 Unreal(以及一般的计算机图形学)中,着色器shader是一系列详细说明对象如何在屏幕上以视觉方式呈现的特定指令。当它绘制你的游戏世界时,着色器将通知引擎关于每一帧的最终像素值。值得注意的是,这项技术在图形编程中无处不在,而不仅仅是在游戏开发中,而且它本身就是一门完整的学科。

着色器在复杂性和相关性能成本方面的变化很大。以下是可能受着色器影响的游戏最终外观的一些常见方面,特别是在虚幻引擎中。

  • 颜色
  • 半透明
  • 你的对象如何响应光和阴影(包括反射、镜面反射和自阴影)
  • 3D 多边形对象顶点的世界位置
  • Tessellation细分(多边形网格的动态细分以创建更密集的几何体)
  • 颜色分级(后处理post-processing)
注意:着色器shader(在技术上)不是material

我们在网上可能会遇到术语“shader”与术语“material”可互换使用。这在以虚幻引擎为中心的论坛和留言板中尤为普遍。这有时会导致混淆,因为虽然它们绝对不是一回事,但在 Unreal 中,这条线有些模糊。
你可以将material视为开发人员输入着色器以获得所需结果的输入。分配纹理,设置颜色值 - 定义着色器随后用于生成输出的参数。
在 Unreal 中,它变得有点混乱,因为当你使用其基于节点的材质编辑器时,你同时制作了material和shader。在编辑器中,每个节点代表一个HLSL 着色器代码模块,可以将它们链接在一起以创建自定义材质/着色器组合。它既定义了着色器指令,又设置了它将使用的参数。这就是为什么你会看到开发人员使用“材质material”和“着色器shader”等术语来表示相同的意思。
就我们的目的而言,要记住的最重要的事情是一种材质material将生成多个着色器shader。这些被称为“permutations”,我们将在下一节中更详细地介绍它们。

2Compile Shader——为么会有这么多
当 Unreal 编译着色器时,它会使用你在材质编辑器中设置的组合模块化指令集,并生成引擎可用于渲染帧的 HLSL 着色器。这当然不是那么简单,只是笼统的说。
但是,你肯定会注意到,虚幻引擎编译的着色器远远多于项目中现有的材质。这是因为对于每种材质,Unreal 都会为每个潜在的用例编译一个着色器——而且可能有很多。你可以在“材质编辑器”中设置面板的“Usage”部分中找到一些常用的。



这些“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关闭视口中的实时预览来节省一些时间。



我用这种技术得到了有好有坏的结果,但其他人发现将编辑器的优先级设置为“低”也有很大帮助。

100升级硬件
如果你已经完成了所有其他工作,但仍然对着色器队列的运行速度不满意,那么可能是时候考虑升级你的硬件了。
在运行时,着色器是使用计算机的 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。

本帖子中包含更多资源

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

×
发表于 2021-11-23 08:18 | 显示全部楼层
抱歉,还是被隔壁秒杀
发表于 2021-11-23 08:19 | 显示全部楼层
隔壁是什么意思
发表于 2021-11-23 08:28 | 显示全部楼层
U3D吧[飙泪笑]
发表于 2021-11-23 08:31 | 显示全部楼层
县城撕裂者表示没啥压力
发表于 2021-11-23 08:36 | 显示全部楼层
除了买机器和Incremental Build没啥大用。买机器的话MAC基本完别想,Incremental Build同理。
Epic似乎没能力解决这个问题,也不关心。差评
发表于 2021-11-23 08:41 | 显示全部楼层
不用隔壁,自己写个shader编译调用接插件进去就随便秒杀了,要的就是在你的地盘把你摁在地上锤的快感
发表于 2021-11-23 08:42 | 显示全部楼层
那肯定哈, U3D工程师入职默认发个MBP干活。要像EPIC这么放肆那干脆每天玩8小时干活一小时得了
发表于 2021-11-23 08:46 | 显示全部楼层
[思考] [思考][大笑]
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-14 19:34 , Processed in 0.096576 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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