Ich überlege, von XNA auf die Stage3D-APIs (Molehill) zu portieren. Als Leistungsprüfung habe ich Sprite-Batching implementiert, aber die Leistung ist nicht besonders gut, während ich mit XNA problemlos bis zu 500.000 Quads zeichnen kann, aber mit meiner Molehill-Implementierung kann ich ungefähr 1000 Quads zeichnen und während a Auf der CPU-Seite wurde ein ziemlich dramatischer Leistungsunterschied erwartet, der auf die GPU-Bindung zurückzuführen ist.
Derzeit ist die Implementierung also wie folgt.
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
Der Engpass ist das Hochladen der Puffer, aber für eine bessere Implementierung hoffe ich auf eine Diskussion hier.
Prost.
Revision:
Eine Optimierung, die in den Sinn kommt, besteht darin, den Indexpuffer beizubehalten, da die Indizes vorhersehbar sind und immer dem gleichen Format folgen. Ich werde das jetzt messen.
Das Zwischenspeichern des Indexpuffers hatte keine nennenswerten Leistungssteigerungen. Um zu verstehen, wo der Engpass liegt, habe ich ihn auf C # / XNA portiert, etwas langsamer als die Implementierung von Microsoft, aber immer noch über eine 500-mal höhere GPU-Kapazität als die Molehill-Implementierung.
Ist Molehill einfach eine extrem schlechte Abstraktionsschicht?