テクスチャ切り替え負荷を測ってみた

まずは切り替えなし。

Stopwatch s = new Stopwatch();
s.Start();
device.SetTexture(0, texture0);
for(int i = 0; i < 10000; i++) {
    頂点バッファで描画;
    頂点バッファで描画;
}
s.Stop();
Logger.WriteLine("ElapsedTicks=" + s.ElapsedTicks);

結果は自分のPCにおいて7800000ticksぐらい。
もちろん2回の「頂点バッファで描画」で描画しているのは同じものです。


次に同じのを設定しなおし

for(int i = 0; i < 10000; i++) {
    device.SetTexture(0, texture0);
    頂点バッファで描画;
    device.SetTexture(0, texture0);
    頂点バッファで描画;
}

8200000ticksくらい。


そして違うテクスチャに切り替えながら

for(int i = 0; i < 10000; i++) {
    device.SetTexture(0, texture0);
    頂点バッファで描画;
    device.SetTexture(0, texture1);
    頂点バッファで描画;
}

9900000ticksくらい。


おまけで毎回GetTexture()で確認して違ったら設定しなおすってのも試す

for(int i = 0; i < 10000; i++) {
    if(device.GetTexture(0) != texture0) {
        device.SetTexture(0, texture0);
    }
    頂点バッファで描画;
    if(device.GetTexture(0) != texture1) {
        device.SetTexture(0, texture1);
    }
    頂点バッファで描画;
}

11000000ticksくらい。
まぁこの場合だと確認しても必ず毎回設定しなおすので上のより速くなるはずはないのですが。
11000000 - 9900000 = 1100000ticks分がGetTexture()でしょうか。

  • 結論:

やっぱりテクスチャ切り替えは重い。
GetTexture()で確認するとかえって重い。でもdevice以外のところでテクスチャを保持しておいてそっち使って確認すれば早いかも