Sto lavorando a un gioco per PC basato su piccole tessere / sprite con un team di persone e stiamo riscontrando problemi di prestazioni. L'ultima volta che ho usato OpenGL è stato intorno al 2004, quindi mi sono insegnato a usare il profilo principale e mi trovo un po 'confuso.
Devo disegnare sullo schermo di 250-750 tessere 48x48 sullo schermo ogni fotogramma, e forse circa 50 sprite. Le tessere cambiano solo quando viene caricato un nuovo livello e gli sprite cambiano continuamente. Alcune tessere sono composte da quattro pezzi 24x24 e la maggior parte (ma non tutte) degli sprite ha le stesse dimensioni delle tessere. Molte piastrelle e folletti usano la fusione alfa.
In questo momento sto facendo tutto questo in modalità immediata, che so che è una cattiva idea. Tuttavia, quando uno dei membri del nostro team tenta di eseguirlo, ottiene frame rate molto bassi (~ 20-30 fps), ed è molto peggio quando ci sono più tessere, specialmente quando molte di quelle tessere sono del tipo che sono tagliati a pezzi. Tutto ciò mi fa pensare che il problema sia il numero di richiami effettuati.
Ho pensato ad alcune possibili soluzioni a questo, ma volevo gestirle da alcune persone che sanno di cosa stanno parlando, quindi non spreco il mio tempo in qualcosa di stupido:
PIASTRELLE:
- Quando viene caricato un livello, disegna tutte le tessere una volta in un frame buffer attaccato a una grande trama di clacson, e disegna un grande rettangolo con quella trama su di essa ogni cornice.
- Metti tutte le tessere in un buffer di vertici statico quando il livello è caricato e disegnale in quel modo. Non so se c'è un modo per disegnare oggetti con diverse trame con una sola chiamata a glDrawElements, o se questo è qualcosa che vorrei fare. Forse hai semplicemente messo tutte le tessere in una grande trama gigante e hai usato coordinate di trama divertenti nel VBO?
SPRITES:
- Disegna ogni sprite con una chiamata separata a glDrawElements. Questo sembra comportare un sacco di cambio di trama, che mi è stato detto che è male. Gli array di trama sono forse utili qui?
- Usa un VBO dinamico in qualche modo. Stessa domanda sulla trama del numero 2 sopra.
- Sprite di punti? Questo è probabilmente sciocco.
Qualcuno di queste idee è sensato? C'è una buona implementazione da qualche parte su cui potrei guardare?