Fa esattamente quello che dice, raggruppa tutti i tuoi sprite (disegni individuali) in una singola chiamata di disegno. Per spiegarlo ulteriormente lasciate che vi dica come LibGDX usa OpenGL per disegnare le cose sulla tela virtuale.
Ogni sprite viene disegnato creando un quad (piatto) nello spazio 3D. Questa mesh quad contiene 4 vertici e ogni vertice contiene i dati del vertice come la posizione e le coordinate della texture. Di solito si costruiscono/manipolano questi dati sulla CPU e quando si è pronti a disegnare li si invia alla GPU. L'apertura di questa connessione tra CPU e GPU è relativamente lenta e quindi raggruppare/raggruppare tutti questi dati e inviarli nel maggior numero possibile di comunicazioni (chiamate di disegno) è il modo più efficiente.
Lo SpriteBatch è una classe che fa questo lavoro per voi. Ogni volta che chiamate draw(), invece di disegnare sullo schermo, inserisce i vertici del vostro quad in un buffer. Quando il buffer è pieno o si chiama end(), invia tutti i dati alla GPU. Per default il buffer può contenere 1000 quads/sprites ma potete specificare la vostra dimensione fino a 8191 quads/sprites, che è una limitazione solo perché SpriteBatch usa primitive brevi per specificare gli indici dei quad. Se avete davvero bisogno di disegnare più sprites in una sola chiamata potete rollare il vostro SpriteBatch, ma 8191 quads distribuiti equamente su una risoluzione di 1080p significa che ogni quad contiene solo un paio di dozzine di pixel. Quindi, se si è intelligenti, un singolo SpriteBatch è sufficiente per la maggior parte dei giochi.
Un'altra cosa da notare è che se si sta utilizzando una texture diversa su uno sprite, verrà anche eseguito il flush e inviati i dati alla GPU per legare la nuova texture. Chiamare draw() 4 volte nell'ordine di texture1 -> texture2 -> texture1 -> texture2 creerà 4 chiamate di draw dove texture1 -> texture1 -> texture2 -> texture2 creerà solo 2 chiamate di draw. Un modo semplice per ridurre le chiamate di disegno in questo caso è quello di utilizzare un TextureAtlas/spritesheet dove si hanno molte immagini individuali una accanto all'altra in una grande texture. Se avete una grande quantità di queste texture e non potete ridurre la commutazione avete la possibilità di rollare il vostro SpriteBatch e shader. Questo compito sembra scoraggiante ma in realtà è abbastanza banale. Date un'occhiata voi stessi alla classe SpriteBatch, tutto ciò che fa il metodo draw() è aggiungere i dati dei vertici ad un array e quando viene chiamato flush() questi dati vengono messi in una mesh che viene effettivamente disegnata. Se riuscite a disegnare un singolo quad texturizzato potete anche creare il vostro SpriteBatch.