金属结构中未使用的属性是否会影响性能

Do unused properties in a metal struct hurt performance

假设我在 .metal 文件中有以下结构:

struct VertexOut{
    float4 position [[position]];
    float2 a;
    float2 b;
};

此结构是我的片段着色器的 [[ stage-in ]] 输入。现在我的一些着色器使用 b 而有些不使用。这是否会损害性能,这意味着我应该为不需要它的着色器创建另一个没有 b 的结构吗?

答案取决于您的使用情况。内存带宽性能会受到影响,但影响很小。 如果您使用此着色器输出全屏像素并且带宽有限,则删除不需要的 float2 可能 有帮助。

但是,更改着色器通常会影响性能,因此您可能会因为不需要更改片段着色器而获得性能优势,这很可能超过任何损失。

我的一个建议是将 a 和 b 更改为 float4 a_b 并使用 a_b.xya_b.zw 访问它。寄存器对齐到 16 个字节,因此这将为您节省 space。举个例子:

struct X { float4 position; float2 a; float2 b; }; struct Y { float4 position; float2 a; }; struct Z { float4 position; float4 a_b; };

在上面的例子中,X将使用48字节(有3个寄存器,每个16字节),而Y或Z只有32字节(有2个寄存器)。因此,使用 Z 可能会给您带来两全其美的效果。