2008年9月26日金曜日

IndexBuffer

 DrawPrimitive系はあんまり呼ばないほうがいいという話なので、
VertexBufferとIndexBufferを使い、できるだけ1回でレンダリングできるように変更してみた。
仕様としては、
VertexBufferに頂点登録→最後にDrawIndexedPrimitiveで描画、
という流れ。
 テクスチャやレンダリングステートが変わる部分ではどうしようもないので、
そこを区切りにレンダリング、それからバッファをクリアして、新たに登録&描画。
 VertexBufferで確保するメモリ量は頂点128個分、
途中で足りなくなったら、とりあえずいったんレンダリングし、
その後バッファをクリアしてから頂点を登録する動作に戻る。
 四角形ポリゴン以外レンダリングする気がないので、
インデックスはバッファを作成したついでにLockして書き込んでおき、2度と変更しない。

 で、結果なんだけど、
壁は一気に全部描画しても頂点は128以下なので1回でレンダリングできて問題なし。
壁のエフェクトも同様。
 ところが、128以上あるオブジェクトだと、バッファが埋まるたびにレンダリングするもんだから、
オブジェクトの表示がすごいチカチカする。
自分のアプリケーションでは垂直同期をまたないので、
バッファのLock、Unlockをするたびに画面になんかでちゃってるのではないかと思う。

 もう一度組みなおしてみたところ、この現象に遭遇しなくなった。
組み方が悪かったらしい。
1000回ほどのDrawPrimitiveを1回のDrawIndexedPrimitiveにすると、
確かに速度がアップした。200回ならともかく1000回ぐらいにもなると差が出るようで。

 よく理屈はわからんが、ともかくチカチカして使い物にならないので、
VertexBufferとIndexBufferを使うのをやめた。
 何も開発に進展がないけど、まあ少し詳しくなったからいいか。
 それ以前にバッファってどれくらいまで確保していいのかがわからん。
インデックスの番号は65535までふれるけど、今回は767しか使っていない。
もっと使ってもいいのかしら。

 
 あれこれしらべてたら「まじあん」の人は普通にDrawPrimitiveUpを使ってるみたいなんで、
明日はこの方向でいってみようとおもう。
(追記)問題は解決したが、物は試しにインデックスを使用しない方法も試してみよう!

0 件のコメント: