您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 Game艺视界 于 2022-9-8 20:24 编辑
本期内容: 如何在虚幻引擎中优化环境,今天我们主要讨论是关于延迟渲染管线,三角形开销和着色器 性能优化贯穿项目整个过程的东西,尽早设置性能指标经常检查添加内容对性能影响
有专门的部门每天检测性能,我们的QA部门每天都在地图上他们要逐个设置摄像机,每次都使用完全相同的摄像机相同的变换相同的硬件,它们需要两到三秒的平均帧时间。然后将其添加到报告中可能有20个摄像机,因为关卡很大我记得有一个洞穴,最长的运行时间是6毫秒9毫秒。我们的目标是每秒60帧即16.66毫秒一切都很顺利
然后有一天它突然上升到25毫秒左右,因为我知道前一天它的运行时间是9毫秒。我知道是某个摄像机导致的问题,我找到我构建的那个摄像机对它运行图片捕捉运用GPU分析工具,然后进入绘制调用弄清楚发生了什么结果发现Xbox One上有一个2080 x 2080的失真纹理。它是一个非常大的纹理上面有一个非常重的着色器,它是全屏的影响了屏幕上的每个像素,因为每天在检测每个摄像机的性能。所以我们知道出了什么问题我们可以立即做出响应 这就引出了另一个问题你设置项目的方式有所不同我们用的是第一人称摄像机摄像机在视平线正下方的位置我们不会在高空中俯瞰远处所有的树木
确定性能指标时务必保持一致 重要命令:stat FPS 我们看一下关于stat FPS 有两个数字每秒帧数和毫秒数 你知道需要几千个三角形来代表你的整个环境 因为你要在照明或后期处理上花费很多时间这由你来决定,所以我们将专注于环境并展示环境资产这意味着 我们的三角形数会非常非常多也许我们可以在其他不影响性能的地方弥补这一点
减少三角形数量与贴图的大小,对于性能的另一个方面:后期处理,后处理材质进行优化,并保存为一条指令。我不必运行屏幕上的每一个像素,但如果我拥有独一无二的资产就像这块石头我不会专注于尽可能地优化它
*阴影深度基本就是渲染所有的动态阴影我们有很多动态阴影,我经常看到这样的问题,阴影在一段距离后消失或者离摄像机很近的阴影非常模糊。我该怎么办? 这些都属于层级阴影贴图的范畴,这些基本上是从我们的角度从摄像机向前的角度渲染不同的阴影贴图,它们可能是1024 2048之类的数字。然后层叠到一定的距离系统可以将第一个层级分解为X个单位,这些等于动态阴影距离
*定向光源:我知道它会投射阴影因为阳光在那里它应该投射阴影 有几个地方需要注意:动态阴影距离是30000个单位,这意味着动态阴影一直延伸到距我们30000个单位距摄像机真的很远(查看下我们场景物体距离摄像机距离)重点是我们要在不牺牲视觉质量的情况下提高性能,因为我知道不会真的看到那么远的动态阴影,我们调小动态阴影的距离调整15000
根据我的经验层级的数量比层级的大小或距离对性能的影响更大 Num dynamic shadow Cascades:3就是每一帧做三次阴影开销会很大,但我使用高分辨率阴影一次开销会很小
阴影延申到15000距离这时候就要用到距离场阴影,请记住当你为网格体生成距离场时这是一个项目设置所有静态网格体都必须这样,这里会有额外的内存负荷
还有一种情况就是级联阴影,如果有一个柱子这个柱子离我们有十万个单位远则会选择级联阴影设置在这里
距离场阴影对我们的性能影响不大
接下来draw和三角形还有着色器
draw call:可将绘制调用视为拥有相同材质的相同几何体,之所以说几何体是因为顶点颜色是几何体的一部分,这意味着如果有两块石头它们是相同的静态网格体资产。但对它们应用了不同的顶点着色,那么它们就是不同的绘制调用,所有这些都在同一个静态网格体Actor中,我们还添加了动态网格体实例化它非常非常有用
stat RHI 调用draw call查看 我们看看如果执行r.meshdrawcomman *为了减少绘制调用次数,我可以做的是必须考虑遮挡以及绘制线程如何为GPU准备所有数据,它首先要做的就是查看所有的调用距离每个Actor都有一个最大绘制距离,我要抓取它现在设置最大绘制距离。我可以把它设为0这意味着我最远绘制距离为0,0意味着不用管它,这意味着我们总要绘制它这不一定是好事,尤其是越来越远因为关于GPU性能的重要一点是随着三角形的尺寸越来越小,GPU渲染它们的开销越来越大,如果有一个小于单个像素的三角形GPU实际上是在渲染
如果你有四个彼此相邻的子像素三角形,它现在必须对相同的像素渲染16次这样开销非常大,我们一次执行的操作越多开销就越大,为了减少绘制调用次数。我可以做的是设置最大绘制距离,设置起来很容易可通过调用距离体积来实现这一点在放置Actor下面
调用距离体积我可以把它拖到世界中,它的作用是提供尺寸选项记住这个尺寸是边界框的,设置尺寸与剔除距离
我们来聊聊四边形过度绘制 回想当初的正向渲染,我们必须从后到前渲染所有东西。如果有一个巨大的雾平面必须在它后面所有东西上进行渲染,然后一遍又一遍地运行像素着色器,这是我们其中一个雾气粒子效果,我们可以看到这导致了很多过度绘制,这个视图显示了每个像素被渲染的次数。我们可以看到在很多情况下每个像素都被渲染了四次对吗?这是小三角形最佳的解决方法之一就是使用LOD
Lod设置和百分比缩减三角形,现在是根据屏幕距离 它可以帮助你处理几乎所有的资产,无论是Megascans资产还是为过场动画引入的高多边形数据你还希望将其压缩一点自动化LOD设置和缩减设置静态网格体编辑器的非破坏性缩减功能非常有用 四边形过度绘制 让你每个三角形绘制四次甚至七次轻松减少到两次或一次 而无需创建手动LOD并导入所有这些
LOD Group:所以LOD组也非常有用这些是所有不同LOD的预置设置,用于预置设置 用于所有大道具 小道具 Vista资产建筑资产 所有这些都内置在编辑器中
进入资产操作 通过属性矩阵批量编辑
这将显示你选择的所有内容你可以点击选择资产的子集,比如我想设置蕨类的调用距离.也许我想以1000个单位调用蕨类,我们会将轰延伸到1000个单位若我想把干植物设为500个单位或者我要抓取所有内容统一设置
植被的调用距离也是很重要也是最简单的从渲染中丢弃内容的方法 从渲染中丢弃内容的另一种方式是:视锥剔除我可以通过Frieze渲染看到它
VICTOR:这是一个非常有用的命令,所以视锥体视图近剪切平面,远剪切平面还有你的视野,这样看过去我认为边界测试是为了查看它是否在帧的范围内,它会丢弃甚至不会将你看不到的东西发送到GPU,那些在你身后的东西 是看不见的。如果有一块边界很大的大石头,但它在其他东西后面它将被发送到GPU,然后在GPU上我们将确定是否要为它执行基础通道启动,所谓的视锥体剔除我们不会渲染你身后的,现在我的视锥体每一帧都会更新我们还是专注于绘制调用
批量选择植被调整最远距离(00:59:50)
我们看一下场景,我们真的没有渲染超过15000个单位的任何东西。你无论如何都看不到叶子,也无论如何都看不到树木或者你不会在远处看到地上的三叶草,可以说它们会消失或者不一定消失,但我们不需要渲染它们,同样只渲染你实际可以看到的细节,当然我们要保存这个
纹理的不同位图设置 例如:如何减小纹理大小以确保我的GPU内存不会因为加载大量4K和8K纹理而完全过载,同时在实际场景中仍然保持非常高的质量和清晰的外观,所以不是去更改每一个纹理,选中纹理只需进入属性矩阵并进行批量更改就更容易了 尤其是当你找到了一个有效的设置,并希望将其应用于以前处理过的纹理别忘了设置纹理组,纹理组位于世界中我想确保世界上的mip LOD偏差是1或者之类的我要放弃最大值可以在这里设置我要放弃最大值,所有这些 可以通过设置纹理组来控制
VICTOR:地形层中的大型纹理是否会影响性能 MATT:对大型纹理进行采样,确实会影响性能纹理越大过滤采样这些操作所需的时间就越多,正如渲染工程师告诉我的那样,我们已经对它进行了一些优化使其不再像以前那样,因为我记得这是使用Xbox 360时的建议,大型纹理的采样开销非常大在某种程度上这是正确的,但如果你在地形中使用运行时虚拟纹理。就像我们这里一样使用运行时虚拟纹理的开销会很小,即使运行时虚拟纹理实际上更大。因为我们在上面做了很多优化,这真的非常酷
我在工作时注意到一点,当我查看场景时当我查看stat RHI时我进行了很多很多次绘制调用
我们有几款内置工具,我来展示一下其中两个两个都只需右键点击。然后全部选择,全部选择以后 右键点击 合并Actors
我要用的是右边的这个,从选定的Actor中获取几何体然后将它们合并到拥有多个实例化静态网格体组件的Actor中,这就是我认为的破坏性改变这可能是项目即将结束时要做的事情,(我们有一个单独的子关卡,保留所有原始的预合并并在其中保留所有网格体所以在进行合并之前实际上要复制到未合并的关卡确保该关卡默认情况下未加载,然后你可以用一种非破坏性的方式使用或处理它)
这次使用左边这个,真的非常好用 如果你有一堆如果你想创建一个全新的静态网格体把它合并在一起进行大量额外的优化这样非常好代理真的非常适合这个用例
这次使用左边这个按材质对它们进行分组,因为在某些情况下根据你按下按钮的方式,你最终可能会将所有这些合并在一起,且每个网格体都将成为它自己的元素,它自己的材质元素出于某些目的那是一种不同的材质,当我们说相同的几何体相同的材质不同的材质时牵扯到更多的绘制调用 我们要把它合并在一起 developer文件夹
它们真的很重要,现在有了这个我可以把它拖到世界中我们可以看到所有的茅草都分在一起,进入这里我可以看到那里只有茅草材质只有四五次,这实际上只有五次绘制调用,但它确实存在LOD弹出问题,但是因为我们在遮罩材质中增加了一些额外的抖动。所以它可以很好地隐藏这种过渡,所以请注意当你将静态网格体Actor合并在一起时这是一项独特的资产,它将占用内存这样也可能不可取
我们希望尽可能地优化它挤出所有的GPU每秒帧数,我们可能会浏览并将这些一起实例化从而减少绘制调用次数。我们可以在很多地方这样做现在我要回到主地图
讨论构建他们构建了风车,JAKOB:这个是最好的例子 把它合并在一起我们可以把所有内容放在一起实例化
我们要在这里渲染深度通道,把它设为不透明和遮罩网格体,然后打开仅限遮罩材质这有助于GPU了解如何在Z通道中选择遮罩材质我把它打开 遮罩和Z通道真的对我们有帮助因为我们有这么多植被我们有这么多遮罩材质
问:虚幻引擎在打造,一个充满重叠对象的整体环境时 如何处理大量的几何体重叠,作为手机和VR开发人员,三角形的体积和纹理范围似乎太大而难以处理 答:如果有一堆几何体堆叠在一起,那这个时候我们就要讨论是否打开HCB occlusion 我需要得到更好的解释 但它实际上是一种更快但更保守的选择遮挡对象的方法通常有一些技巧可以确定是否需要启用或禁用它这是项目设置值得去研究的东西
问:绘制调用是造成高纹理性能损失的唯一原因吗?如果是的话 是因为纹理复杂性还是大小 答:我们看一下是否可以正确解析,纹理将作为绘制调用的一部分输入到材质中。如果有一个超高分辨率的纹理,这意味着超高分辨率的MIPS则会是非常复杂的材质,并且它分布在整个屏幕上那么开销会非常大,绘制调用次数非常多的原因是因为这是我们必须一遍又一遍地重复执行的操作次数,基本原理是我们做的操作越少开销就越小 速度就越快,如果高分辨率纹理是一堆绘制调用的输入那么它的开销就很大
优化场景时都要查看这个列表,了解哪些需要投影,也许我关闭了一些离地面很近的阴影投射或者我知道它会一直在阴影中,也许我在优化材质也许我改变了投射阴影的方式它真的降下来了
Ctrl-Shift-逗号键,就会弹出GPU Visualizer这是我最喜欢的工具之一。我们继续这是你将在RenderDoc中看到的内容的直观表示 在RenderDoc中我可以查看发送到GPU并进行渲染的几何体,这一个功能有点少但它仍然非常有用
后期材质 做一个模糊,做了很多次采样还有很多IF
担心它在低规格计算机上的性能,如果遇到这种情况怎么样,我可能会进入引擎可延展性把设置调低,如果需要在低规格计算机上进行优化那就要在高规格计算机上进行超优化这是一种思考方式
当涉及到LOD时如果资产拥有高多边形数量,例如Megascans资产那么不使用LOD0和LOD1是否有好处;主要是帮助减小项目大小 MATT:项目大小非常重要,我想如果我担心有多少空间,特别是在这个时候或者对于分散的团队使用家庭互联网并不是最好的选择我不想让制作朋友下载20G或30g你需要在资产层面考虑这一点
问:对于地形材质的绘画层建议使用多少层,所有这些都可以拥有不同的植被草地类型而不会对性能产生太大影响吗? 答:这取决于你会看到多少地形你的目标是什么平台,因为在某种情况下层数会增加纹理的数量。你必须使用共享纹理采样器,但也许你的目标平台没有共享纹理采样器,我认为对于移动设备这可能是一个问题所以要看情况。
要记住的另一点是这将增加必须编译的材质数量,因为每个组件的层数越多,它要创建的材质子排列就越多,但归根结底我不一定推荐超过16个真的很多。但所有这些都将融入运行时虚拟纹理这大大简化了我们绘制地形的开销。但是材质越多绘制调用的次数就越多,绘制调用的次数越多开销就越大依此类推这一点要记住 一旦开始考虑,可以有多少层纹理大小呢我的多边形预算呢? 这些都是有一定的但不是硬性限制而是合理的限制
使用子关卡时可能带来的性能方面的好处? 在进行构建时我们将使用Megascans库中的模块化组件来构建它们,使用自定义创建的资产让它们感觉更加破旧和梦幻。如果我在我的主关卡中组装这些那么问题是我可能会创建很多脏文件,并将有一个超级混乱的世界大纲。 通过将它们单独放在一个关卡我为每一栋特定于该构建过程的房子都提供了一个地方,如果我想更改房子我不需要担心其他问题我只需要进去知道要建什么房子,则可以在不影响主关卡的情况下更改一切。我可以更改光照情景从HDRI切换到过程天空系统试试雾深入,了解后期处理设置查看某些材质或效果何时中断,只是在某种程度上破坏了构建关卡而实际上没有破坏主关卡
从性能的角度来看,显然将不同的数据块分解到子关卡中的一个好处是,我们又打开了调用距离体积,所有的树都不见了强大的调用距离也许我知道在一定的距离内,我不需要这个房子的内部,我们可以走进所有的房子。这个时候我们要开始担心所有这些子关卡的流送,我只会在你距离1000 2000个单位时流送房子的内部,具体取决于需要多长时间。还有一个好处是HLOD想法是将一堆资产组合在一起,为它们创建一个LOD从LOD创建一个LOD 因此将所有内容分解为子关卡以支持该工作流
我很喜欢Imposter Baker我有一点使用的经验,我认为它是一款非常有用的工具,特别是优化植被之类的资产。因为它基本上会做两件事,它会给你它的烤卡表示,它会为你提供它的单帧表示,它会根据你的摄像机角度对它所看到的子帧进行插值,Imposter Baker真的非常有用如果你知道远处有一堆树对我不需要渲染所有的,我不需要在这个距离上渲染,这棵树的所有三角形因为在远处所有东西都会变平这就是视野的工作原理 也许我只需要这张卡片这张卡片只是查看纹理,然后决定要绘制的内容而不是专注于所有的三角形或者这棵树的不同部分,需要注意的是它不是动画树。但是这棵树在一定距离内的摇摆,这可能是左半像素或右半像素也许我不需要看到那个。是的我喜欢Imposter Baker
本期分享就到这里!更多精彩+++关注联系我们
|