XNAからStage3D API(Molehill)への移植を検討しています。したがって、パフォーマンス検査としてスプライトバッチ処理を実装しましたが、パフォーマンスはそれほど優れていませんが、XNAを使用すると、最大500,000のクワッドを簡単に描画できますが、Molehillを実装すると、約1000クワッドを描画できます。 CPU側ではかなり劇的なパフォーマンスの違いが予想されましたが、これはGPUにバインドされているためです。
したがって、現在の実装は次のとおりです。
set render states
let texture be null
let batchSize be arbitrary
for each sprite in queue
if texture is not sprite texture
or buffers are full
upload vertex data to index buffer
upload index data to vertex buffer
bind texture
draw triangles
flush vertex data
flush index data
add sprite vertices to vertex data
add sprite indices to index data
end
upload remaining vertex data to vertex buffer
upload remaining index data to index buffer
draw remaining triangles
flush data
ボトルネックはバッファのアップロードですが、より良い実装については、ここでの議論を期待しています。
乾杯。
リビジョン:
頭に浮かぶ1つの最適化は、インデックスが予測可能であり、常に同じ形式に従うため、インデックスバッファーを永続化することです。それを今ベンチマークするつもりです。
インデックスバッファーをキャッシュしてもパフォーマンスはそれほど向上しなかったため、ボトルネックがどこにあるかを理解するためにC#/ XNAに移植しましたが、Microsoftの実装よりも少し遅いですが、GPU容量は500倍以上ありますMolehillの実装。
Molehillは単に非常に悪い抽象化レイヤーですか?