DirectXで2Dの話

DXRubyは2D専用だからして、DirectX9を使っていながら2D描画しかしない。
2Dとはいえ一応ポリゴンで描画するから、テクスチャを設定したり頂点を計算したりする。
そのあたりはどうもよくわかっていなくて、とりあえずD3DXSpriteを使わないようにはしたが、まだ改善の余地がありそうな気がする。


頂点ストリームというものがある。
いまどきのGPUは頂点シェーダを持っていて、頂点ストリームに突っ込んだ頂点情報をまとめて計算してくれる。
ストリーム1つにつきテクスチャも1つだし、頂点4つ単位に違う計算をするとか普通に考えたらできないだろうから、2Dの場合は通常、ストリームを使わずに頂点を自分で計算して1枚ずつ別々に描画する。
テクスチャを1つにまとめることができればテクスチャの設定しなおしが省けるが、ユーザーに全ての絵を1枚にまとめることを強要するのは無理があるし、自動でまとめるにしてもテクスチャサイズがGPUの限界を超えて大きくなった場合に分割してしまったら効果が見込めない。


いまは頂点計算は自分で計算して、スタックに突っ込んで、DrawPrimitiveUPする。
内部動作を推測すると、DrawPrimitiveUpはメインメモリからGPUが高速アクセスできる場所にデータをコピーする処理だ。
頂点バッファを作成してロック、頂点書き込み、アンロック、ストリーム設定、DrawPrimitiveという流れの場合、アンロック時にデータのコピーが発生する。
同じテクスチャを使う大量の頂点に対して同一の計算をハードで行う場合は、頂点バッファを作ったほうがいいだろうが、一つ一つに対して別の計算・別のテクスチャとなる2Dでは頂点バッファを使わないほうが速そうだ。
実際ちょっと試したときにすごく遅かった。が、そのときはまだまともに動いてなかったから、比較対象として問題がある。
またそのうち、描画部分にバッファを割り当てる形でちゃんと動くものを作って検証しなければならないだろう。