昨日、SetRenderState()とかをキャッシュするStateManagerを作成したので、今日はそのパフォーマンステストプログラムを作成してみました。
SetRenderState()の発行回数は当然減らせるだけ減らすべきなので、無駄な発行を行わないようにキャッシュしておくのStateManagerです。
と言うのも、会社の先輩にSetRenderState()の速度について聞かれて、そういえば試したことなかったなと思ったので。
で、ついでに他のテストもかねてやってみたわけで。
2000ポリゴン弱のモデルを読み込み、以下の3種類の頂点バッファ、インデックスバッファを作成します。
1.メッシュごとに頂点バッファとインデックスバッファを作成する
2.頂点バッファをモデル全体で統合し、インデックスバッファはメッシュごとに作成する
3.頂点バッファもインデックスバッファも1つに統合する
これでそれぞれテストを行ったのですが、速度はどれもほぼ変わりません。
やはり、3が若干速かったですが、FPSにして1も違いませんでした(Z書き込みなしで1000体表示して22FPSくらい)。
次に問題のStateManagerですが、やはり1000体表示しました。
当然、SetRenderState()、SetTextureStageState()、SetSamplerState()をそれぞれキャッシュを通した場合と通していない場合でチェック。
結果はほぼ変わらず。というか、先のテスト以上に差がない。
これはどういうことでしょう?
考えられるのは、そもそもDirectX、もしくはドライバの方でキャッシュを行っている可能性です。
調べてみたのですが、”Pure Device”ならキャッシュは効かない、と言うような話があるフォーラムにありました。
つまり、”Pure Device”ではないと言うこと?っていうか、”Pure Device”ってなに?
ちなみに、std::map を使ったのですが、Debugモードだとかなり重いです。Releaseモードなら問題なし。
と言うわけで、このStateManagerは失敗かも。
std::map を std::vector あたりで実装するならもう少し速くなるかも。
無駄な項目が出てきてしまいますが、O(1)でアクセスできるし。
まあ、そっちも試してみます。
追記
std::map を std::vector に変えてみましたが、ほぼ変わりません。
誤差程度の差なので、意味がないですね。
とりあえず std::map で行こうと思いますが、使うかどうかは微妙なところか。