UE Shader 优化(Optimizing Shaders in Unreal Engine)
发布网友
发布时间:2024-09-26 23:15
我来回答
共1个回答
热心网友
时间:2024-09-29 18:31
记录来自 @BlueshiftIntLtd 的CEO & 技术总监 & 首席技术美术 @calvinatorr Luna的blog:“Optimizing Shaders in Unreal Engine”
原文链接: Optimizing Shaders in Unreal Engine – Luna's Technical Art Blog
Instruction CountsStatic Parameters
静态参数,这些参数能在材质实例中修改,但是会 dirty the permutation,导致生成新的shader,增加shader数量,占用更多磁盘空间。
Usage Flags
每勾选一个Usage,都会生成新的shader,上面我们得知,勾选Used with Skeletal Mesh后,新的shader VS Instrution counts 比 Static Mesh 会高出100多(但是有一些shader是共享的)
解决办法:取消勾选 Automatically Set Usage in Editor ,手动指定材质需要被渲染在什么类型的 Primitive上 对于拥有许多材质实例的父类材质而言,建议关闭自动设置Usgae(如果意外设置到了 Used with Skeletal Mesh,会增加非常多 Shader Permutaitons)
GPU Cycles
GPU 时钟周期指的是完成一次高低电平变化需要的时间,对于不同时钟频率的GPU,数值不同 例如: 3060 Base Clock - 1.41GHz 4090 Base Clock - 2.23GHz 2.23GHz 代表每秒进行22.3亿次操作,因此4090的时钟周期就等于 1/2.23GHz,约等于0.44纳秒,时钟周期不是一个固定的数字,因此我们使用 Cycles 来衡量指令的开销,而不是具体的时间。
Distance Squared
length() 需要先平方再开方,一个length() 要消耗28个时钟周期
在条件允许的情况下(如比较距离大小),更多地使用 距离平方,而不是距离。我们可以通过 dot(x, x) 轻松得到距离的平方
Constant Optimization(Folding)
编译器会在编译阶段帮我们对一些固定常量(变量不行)进行预计算,从而减少编译后 shader 的指令数
Luna:“I’ve seen a note about how this doesn’t work inside custom nodes, but this is actually untrue because the optimzation occurs when the assembly is proced and thus won’t necessarily be reflected by the stats tab in Unreal.”
Sampling Textures – Optimising for Pre-Fetches
根据我查到的资料来看,该情况只会发生在老式硬件上(OpenGL ES 2 & Earlyer), OpenGL ES3 不会受影响,但是将计算移到 VS 中还是有好处的 "Dependent texture reads are supported at no performance cost on OpenGL ES 3.0–capable hardware" Apple OpenGL ES Doc
以上两种情况都会导致 GPU 无法进行 Pre fetch(据说 Modern hardware)解决方案 为了避免产生 Dependent texture fetch,也就是修改UV,我们可以将对 UV 的计算从PS 移到 VS中进行
都能将计算移到 VS中进行,并且 VS 中的计算次数在通常情况下都是远小于 PS,如果可以,尽量将计算放在 VS 中进行(注意,非线性计算可能会产生 artifacts,具体程度根据mesh的顶点数来决定)
UE Docs 说这是 Mobile specific