Dev stuff: I discovered that my textures weren't being reused. My resource manager won't load the same texture twice, it'll just return the same one (Unless you explicitly tell it not to). That makes sharing resources transparant. However, the texture manager doesn't. So you load texture A from the resource manager and add it to the texture manager. It adds it to the texture sheet and returns. You then load texture A again and add it to the texture manager. The resource manager returns the stored texture, but the texture manager inserts another copy into the texture sheet.
Anyway, that's fixed now.
Also, ID3DXFont stuff - I'm in the process of writing my own derived ID3DXSprite to do the font rendering. I'll wrap that up into a sprite object in my scene, which should help with batching even more. I don't know if it'll work, it'll be easy enough to test. The main reason is that I can't get ID3DXFont to use the Z buffer. I guess there's a way, but I don't know. Implementing a wrapper around ID3DXSprite would do it (I can manually changethe Z coords), but then so would going the whole hog.
Sprite animation is done too, you can specify several frames for a sprite and change between them. It's all optimized so it won't touch the scene graph unless it really needs to (If the actual texture pointer changes). I could perhaps do with trying to force a sprite to keep all of it's animations on one sheet, but I don't think that's at all important. It's up the game code to actually animate the sprite, which makes sense.
Anyway. Work time...