实际上,链接着色器与使用单个着色器进行相同工作相比需要多少开销?
换句话说,链接着色器与开发一个怪物着色器是否更可取?或者链接它们的开销是否要求使用尽可能少的着色器?
作为一个例子,考虑@warrenm sample" Image Processing" project。有adjust_saturation
着色器链接到gaussian_blur_2d
着色器。将两个着色器组合成一个着色器可以显着提高性能,还是实际上是相同的?
答案 0 :(得分:0)
我希望在您将adjust_saturation
与gaussian_blur_2d
合并的示例中获得显着的性能提升(假设他们按照他们的名字做的建议)。
从GPU的角度来看,两个操作在需要完成的数学方面都是微不足道的,性能将完全由纹理获取和写出结果控制。我想象高斯模糊正在做更多的工作,因为它可能每个输出片段有多个纹理样本。通过组合两个着色器,您可以完全消除纹理读取和写入调整饱和度的成本。
我认为通过结合这两项操作,您可以期望获得显着的性能提升,比链接它们快大约10%-40%。请记住,您可能没有看到帧速率的差异,因为iOS在管理CPU / GPU时钟速度方面非常活跃,因此很难准确地测量内容。
答案 1 :(得分:0)
这取决于纹理的大小和缓存的大小。如果你必须优化它,可能值得将它们组合成一个着色器。如果要重用代码,创建一组更简单的着色器并将它们组合起来是有意义的(就像我的VideoShader项目https://github.com/snakajima/vs-metal)。
顺便说一句,当您组合多个着色器时,最好创建一个命令缓冲区并将所有着色器编码到该命令缓冲区中(而不是为每个着色器创建命令缓冲区)。它允许Metal进行一系列优化。