Estou pensando em migrar do XNA para as APIs do Stage3D (Molehill). Portanto, como um exame de desempenho, implementei lotes por sprite, mas o desempenho não é tão bom assim, enquanto que com o XNA eu posso desenhar facilmente 500.000 quads, mas com a minha implementação Molehill eu posso desenhar uns míseros 1000 quads e enquanto era esperada uma diferença de desempenho bastante dramática no lado da CPU, devido ao fato de estar vinculado à GPU.
Portanto, atualmente a implementação é a seguinte.
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
O gargalo está carregando os buffers, mas quanto a uma implementação melhor, espero uma discussão aqui.
Felicidades.
Revisão:
Uma otimização que vem à mente é manter o buffer do índice, pois os índices são previsíveis e sempre seguirão o mesmo formato. Vou avaliar isso agora.
O armazenamento em cache do buffer de índice não teve ganhos de desempenho perceptíveis; portanto, em um esforço para tentar entender onde está o gargalo, eu o transportei para C # / XNA, um pouco mais lento que a implementação da Microsoft, mas ainda tem uma capacidade de GPU 500 vezes mais que a implementação da Molehill.
Molehill é simplesmente uma camada de abstração extremamente ruim?