Sto sviluppando un gioco 2D basato su sprite per piattaforme mobili e sto usando OpenGL (beh, in realtà Irrlicht) per il rendering della grafica. Per prima cosa ho implementato il rendering sprite in modo semplice: ogni oggetto di gioco è reso come un quad con la sua chiamata di disegno GPU, il che significa che se avessi 200 oggetti di gioco, avrei fatto 200 chiamate di disegno per frame. Ovviamente questa è stata una scelta sbagliata e il mio gioco è stato completamente vincolato alla CPU perché c'è un piccolo sovraccarico della CPU associato ad ogni richiamo della GPU. La GPU è rimasta inattiva per la maggior parte del tempo.
Ora, ho pensato di poter migliorare le prestazioni raccogliendo oggetti in lotti di grandi dimensioni e eseguendo il rendering di questi lotti con poche chiamate di disegno. Ho implementato il batch (in modo che ogni oggetto di gioco che condividesse la stessa trama sia riprodotto nello stesso batch) e ho pensato che i miei problemi fossero spariti ... solo per scoprire che il mio frame rate era persino più basso di prima.
Perché? Bene, ho 200 (o più) oggetti di gioco e vengono aggiornati 60 volte al secondo. Ogni frame che devo ricalcolare nuova posizione (traduzione e rotazione) per i vertici nella CPU (GPU su piattaforme mobili non supporta l'istanziamento, quindi non posso farlo lì), e fare questo calcolo 48000 al secondo (200 * 60 * 4 dal ogni sprite ha 4 vertici) sembra semplicemente essere troppo lento.
Cosa potrei fare per migliorare le prestazioni? Tutti gli oggetti di gioco si muovono / ruotano (quasi) ogni fotogramma, quindi devo davvero ricalcolare le posizioni dei vertici. L'unica ottimizzazione che mi viene in mente è una tabella di ricerca per le rotazioni in modo da non doverle calcolare. Point Sprites aiuterebbe? Qualche brutto trucco? Qualunque altra cosa?
Grazie.