一.着色器性能优化

1.衡量着色器的性能

衡量着色器性能的主要方法有三个

第一个:可以使用场景的视图模式的优化视图模式的着色器复杂度

下面的滑条代表了着色器指令的复杂度

如果场景大部分是绿色的,说明着色器耗能低,反之白色则是很糟糕

这种使用性能视图的方法并不完美,因为它只会给出一个概况,让你知道哪个的着色器比其它的更耗能

第二个:检查着色器中执行的指令数量

在编辑器的底部写着Base pass shader: 135 instructions,,代表现在的shader的汇编指令数量是135

我们编写的节点首先会被编译成HLSL代码 ,然后被编译成汇编语言指令,然后会传递给驱动程序,然后传递给显卡

所以只要我们减少指令的数量就会使得着色器更高效的运作,但是这也不是一个完美的办法,

因为并不是所有指令在GPU上运行所需时间都相同 ,可能有的指令运行要1000ms,有的只需要200ms,这样着色器主要由第一个指令或者第二个指令组成的话性能就会差距很大。

第三个:将着色器应用到模型上,把模型放进场景里,然后在目标平台上运行。当然这是在项目完成的时候,因为不同的硬件的性能不同,每个着色器的行为也会由不同。但是当我们在构建着色器的时候,根据指令计数来判断是一个很好的办法。

总结:

2.优化着色器

1.Method #1

Get rid of anything you're not using,移除掉任何你没有使用的节点,或者是纹理采样的结果是一片黑色,或者说数学计算的结果一直是0,这些都是无用的消耗。所以移除掉任何用不到的节点。

2.Method #2

Refactor math formulas,重构你的数学计算,并使用不同的方法来获得相同的结果。

比如之前创建的环境混合着色器。

这个power节点是用来增加着色器的对比度的,并且如果缩小power的值为1,苔藓与岩石的分界线的位置也会改变。

现在我们碰巧知道power节点是比其它节点更耗能的。因此我想尝试用别的东西代替这个节点,同时也可以调整对比度,但是也不会改变分界线的位置。

我们使用了一个新的方法来做到和power类似的效果,用来改变对比度。新的方法通过将z值小于0.5的推向底端,大于0.5的推向顶端。但是新的方法只需要131条指令,相对于原来指令数少了4个,并且新的方法并不会 改变苔藓与岩石的分界线

虽然减少了四条指令可能看起来不多,但是如果让它覆盖整个屏幕或者如果由大量的着色器,只要删去一些指令,就可以在性能上节省一到两毫秒,就可以给玩家带来每秒几帧的更好性能

3.Method #3

"Pipelining"-combining components  into float4s to do less math

将分散的向量合并到一起,并且减少数学计算量。例如在之前的扭曲着色器中,

原来在使用噪声贴图扭曲uv的时候进行了两次乘法和两次加法运算,但是在下面优化后的方法就只有一次乘法和一次加法运算,这同样可以节省一些性能

4.Method #4

Texture channel packing

如果由多个纹理采样,并且它们使用同一个UV,如果可以将它们打包成一张纹理,那样可以节省很多性能。纹理采样在着色器的耗能是十分大的。

比如下面的这个例子,将AO,Specular,Roughness贴图合并到一张贴图了,这是一个非常大的优化,并且指令数也从102减少到了100条

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部