当片段着色器参数的数量增加时,Metal为什么会变慢?

时间:2019-02-07 20:26:43

标签: objective-c macos metal fragment-shader metalkit

我有一个非常基本的片段着色器,它接受如下定义的数组纹理数组:

fragment float4 shader(RasterizerData in [[ stage_in ]],
                       sampler sampler2d [[ sampler(0) ]],
                       const array<texture2d_array<half>, 5> textures [[ texture(0) ]]) {

  return float4(textures[in.textureIndex].sample(sampler2d, in.textureCoordinate, in.textureSlice));
}

我想向此着色器传递可变数量的纹理。每个纹理是一个阵列纹理,每个阵列纹理是不同的大小。 (因此,为什么我不能只传递单个数组纹理。)

在上面的代码中,由于我通常只有1个纹理,因此我将数组大小任意定义为5。如果我的纹理少于5个,则片段索引未在我的应用程序代码中设置。

我的应用代码与此类似:

for (int i = 0; i < textures.size(); ++i) {
  [renderEncoder setFragmentTexture:textures[i] atIndex:i];
}

数组大小为5时,性能很好。但是,如果我所做的唯一更改是在着色器中将数组的大小重新定义为64,则总体渲染性能将直线下降。没有其他更改,这意味着大多数片段纹理索引都未设置。

为什么这种变化会对性能产生如此大的影响?

GPU调试器显示大部分时间都花在了我的渲染编码器的drawIndexedPrimitives上。 (24.04 ms)当我声明一个较小的数组大小时,我可以轻松实现60fps。

在macOS 10.14上,MacBook Pro 13“ TB 2016。

0 个答案:

没有答案