Qu’est-ce que Spritebatch dans libGDX ? Pourquoi faisons-nous des objets de cette classe lorsque nous travaillons sur Android Studio ?


Elle fait exactement ce qu'elle dit, elle regroupe tous vos sprites (dessins individuels) en un seul appel de dessin. Pour l'expliquer davantage, laissez-moi vous dire comment LibGDX utilise OpenGL pour dessiner des choses sur le canevas virtuel.

Chaque sprite est dessiné en créant un quad (plat) dans l'espace 3D. Cette maille quad contient 4 sommets et chaque sommet contient des données de sommet telles que les coordonnées de position et de texture. Vous construisez/manipulez généralement ces données sur le CPU et lorsque vous êtes prêt à dessiner, vous les envoyez au GPU. L'ouverture de cette connexion entre le CPU et le GPU est relativement lente et, par conséquent, le regroupement/la mise en lot de toutes ces données et leur envoi en autant de communications (appels de dessin) que possible est le moyen le plus efficace.


Le SpriteBatch est une classe qui fait ce travail pour vous. Chaque fois que vous appelez draw(), au lieu de dessiner sur l'écran, il ajoute vos sommets de quad à un tampon. Lorsque soit le tampon est plein, soit vous appelez end(), il envoie toutes les données au GPU. Par défaut, le tampon peut contenir 1000 quads/spires mais vous pouvez spécifier votre propre taille jusqu'à 8191 quads/spires, ce qui est une limitation simplement parce que SpriteBatch utilise des primitives courtes pour spécifier les indices des quads. Si vous avez vraiment besoin de dessiner plus de sprites en une seule fois, vous pouvez créer votre propre SpriteBatch, mais 8191 quads répartis également sur une résolution de 1080p signifie que chaque quad contient seulement quelques dizaines de pixels. Donc si vous êtes intelligent à ce sujet, un seul SpriteBatch est suffisant pour la plupart des jeux.


Une autre chose à noter est que si vous utilisez une texture différente sur un sprite, il va également flush et envoyer les données au GPU afin de lier la nouvelle texture. Appeler draw() 4 fois dans l'ordre texture1 -> texture2 -> texture1 -> texture2 créera 4 appels de dessin alors que texture1 -> texture1 -> texture2 -> texture2 ne créera que 2 appels de dessin. Un moyen facile de réduire les appels de dessin dans ce cas est d'utiliser un atlas de textures ou une feuille de calcul où vous avez beaucoup d'images individuelles les unes à côté des autres dans une grande texture. Si vous avez une grande quantité de ces textures et que vous ne pouvez pas réduire la commutation, vous avez la possibilité de créer votre propre SpriteBatch et shader. Cette tâche semble intimidante mais est en fait assez triviale. Jetez un coup d'œil à la classe SpriteBatch vous-même, tout ce que fait la méthode draw() est d'ajouter des données de vertex à un tableau et lorsque flush() est appelé, ces données sont placées dans un maillage qui est réellement dessiné. Si vous pouvez dessiner un seul quad texturé, vous pouvez également créer votre propre SpriteBatch.