2016-08-17 9 views
0

内の未使用のプロパティは、私が.metalファイルに次の構造体を持っていると仮定してください:金属構造体を傷つける性能

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

この構造体は、私のフラグメントシェーダの[[ stage-in ]]入力されています。今では私のシェイダーのいくつかはbを使用しており、いくつかは使用していません。これはパフォーマンスを傷つけるのでしょうか?つまり、必要がないシェーダのためにbのない別の構造体を作成する必要がありますか?

+0

未使用のプロパティに悪影響を及ぼすのは、バッファにコピーする必要があるメモリが無駄になるということだけです。それ以外の問題は私には見えません。私は100%ではないので、塩のピンチでこれを取る。 –

答えて

0

答えは使用方法によって異なります。メモリ帯域幅のパフォーマンスが低下しますが、それはかなり小さくなります。 このシェーダを使用してフルスクリーンのピクセルを出力していて、帯域幅に制限がある場合は、不要なfloat2を削除してください助けてください。

しかし、シェーダを変更するとパフォーマンスが低下することがよくあります。したがって、損失を上回る可能性のあるフラグメントシェーダを変更する必要がないため、パフォーマンス上のメリットが得られる可能性があります。

私は、aとbをfloat4 a_bに変更し、a_b.xya_b.zwでアクセスすることをお勧めします。レジスタは16バイトに揃えられているため、スペースが節約されます。この例を取る:YまたはZは、32バイト(2つのレジスタがある)であるのに対し、上記の場合

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

を、Xは、48バイト(16バイト毎の3つのレジスタがある)を使用します。したがって、Zを使用すると、潜在的に両方の世界の最高を与えるでしょう。

関連する問題