ためしてみた

ZSortDisable状態で、1ポリゴンスプライトで全てを同じテクスチャとして、CreateVertexBufferして同じ頂点バッファに押し込んでDrawPrimitiveで一気に描画する。
とりあえず現時点で最もパフォーマンスが出るパターンであるはずなのだが、結果は13300個とイマイチであった。
また別のどこかにボトルネックがあるのか。


オブジェクト数8000でカウントを測ってみると、CreateVertexBufferとロックで3500前後、DrawPrimitiveが80前後、UnlockとSetStreamSourceはほとんど1桁、Presentが約35000.
Rubyの処理は70000、draw全体で約38000という感じであった。
頂点計算はメソッド内でやっているからRuby処理に含まれている。
ここから察するに、頂点データの転送の時間がネックになっているようだ。
はじめはD3DPOOL_DEFAULTで作ってみたのだが、なんだか遅かったから、SYSTEMMEMに変更したら速くなった。それで13000だ。
うちのPCはAGPだから、ひょっとするとそれが原因かもしれない。
2Dゲームは頂点情報が全て書き換わるから、頂点セットをビデオメモリにおいてどうこうってこともできないし、やっぱりこのへんが限界なのか。
しかしまあ、こんな性能なら確かに3Dゲームを作るのは大変だ。
頂点数を節約して、メモリ帯域をいかに効率よく使うかがポイントになるのだろう。


PCI-Eとか使ってるPCなら速く動くのは当たり前で、俺としては遅いPCでどうやって快適に動かすかを焦点にしたいから、最速を目指す話はこれでおしまいとする。
次からはまた別の視点で色々チャレンジしてみよう。