I thought sprite batches were the way to go for the last 3 years, but the more I use my sprite batch system, the more I wonder if it's actually helping? I understand the benefits: fewer texture swaps, shader swaps and draw calls overall.
The way I use my sprite batch class is to accomplish what I described above. I have a Sprite class which I create instances of, and add them to my SpriteBatch instance which also has a reference to a texture atlas. I can setup each sprite's blitting data, transform them, etc. and the Sprite Batch will keep track of every sprite's vertices in a single array.
Life is good, isn't it? Then, I started analyzing the cons I've found using them:
-Most sprites aren't using the same texture all that frequently unless you're using a tile map, but tile maps can be handled as a special-case anyway. Outside of that, it's very rare to have the same sprite show up multiple times onscreen.
-Batching requires all sprites to software-transform the vertices they own in the vertex array in OpenGL ES 2.0 --very common right now for mobile games
-If you wanted to make a sprite invisible because you didn't want to render it at that time, you couldn't just simply not render it. You'd have to give that sprite's vertices an alpha value of zero so they're completely transparent. This is a blending performance killer on mobile devices
-Frustum culling is inefficient. If you use a sprite batch for a large area that has many of the same sprite, say, the same enemy, you'll be able to draw them all at once easily, but usually only a couple of them, if any, are onscreen at a time
-Color data is needed per vertex to apply a color overlay to a sprite instead of a single uniform because its vertices are batched with the rest
-Any time you want to draw a sprite, you need a sprite batch. This is a pain if you're making an RPG with 4 main characters where they each have their own batches. Each character needs its own sprite batch for their sprite even though they're the only instance that'll ever need it at a time
-Storing a sprite in multiple lists are a pain as well. I'm writing a 2D engine where each Sprite is a scene object with its own transform matrix. Not only does it have to be included in the scene's object dictionary (STL map), but now its corresponding sprite batch needs to keep a pointer to it in its own list. This is problematic because if the Sprite is released from memory, I now need to make sure both the batch and scene know it.
Just my thoughts