Estou desenvolvendo um jogo 2D baseado em sprite para plataforma (s) móvel (s) e estou usando o OpenGL (bem, na verdade, o Irrlicht) para renderizar gráficos. Primeiro, implementei a renderização de sprite de uma maneira simples: todo objeto de jogo é renderizado como um quad com sua própria chamada de empate na GPU, o que significa que, se eu tivesse 200 objetos de jogo, fiz 200 chamadas de empate por quadro. É claro que essa foi uma péssima escolha e meu jogo foi completamente vinculado à CPU porque há uma pequena sobrecarga de CPU associada a cada chamada de empate da GPU. A GPU permaneceu ociosa a maior parte do tempo.
Agora, pensei em melhorar o desempenho coletando objetos em lotes grandes e processando esses lotes com apenas algumas chamadas de empate. Eu implementei lotes (para que todos os objetos do jogo que compartilham a mesma textura sejam renderizados no mesmo lote) e pensei que meus problemas haviam desaparecido ... apenas para descobrir que minha taxa de quadros estava ainda mais baixa do que antes.
Por quê? Bem, eu tenho 200 (ou mais) objetos de jogo e eles são atualizados 60 vezes por segundo. Cada quadro que eu tenho que recalcular nova posição (translação e rotação) para vértices na CPU (GPU em plataformas móveis não suporta instanciação, então não posso fazê-lo lá), e fazendo esse cálculo 48000 por segundo (200 * 60 * 4 desde todo sprite tem 4 vértices) simplesmente parece muito lento.
O que eu poderia fazer para melhorar o desempenho? Todos os objetos do jogo estão se movendo / girando (quase) todos os quadros, então eu realmente tenho que recalcular as posições dos vértices. A única otimização que eu conseguia pensar é uma tabela de consulta para rotações, para que eu não tivesse que calculá-las. Os sprites de ponto ajudariam? Algum hacks desagradável? Algo mais?
Obrigado.