I'm writing a 2D room-based* platformer using XNA, and I'm trying to figure out the best way to load resources based on what the current map requires. Basically, I need to (want to) dispose of the loaded tileset/textures and load just the ones the next map requests at every transition (ideally, I'll check if they're actually different first), without killing off the more universal textures (player sprites, etc.).

I've seen a few forum posts saying the best way to do this is to create a second instance of ContentManager, but they never go into detail on how to do this correctly.

Currently, my XML map files each contain strings with the filenames of all necessary assets. I was planning on having my XmlReader method load the textures as their names were read, but then I realized I knew neither how to instantiate the second ContentManager, nor where to instantiate it--i.e., should it be in the MapFactory class that's loading the map, or in the static LevelManager that's calling the MapFactory (passing the new ContentManager as a parameter to the MapFactory, along with the name of the desired map)?

Alternatively, is there a simpler/cleaner way to do this? I'm more concerned with the code being easily comprehensible than efficient right now, as this is my first attempt at this kind of game.

*Ex. Castlevania, Metroid, but simpler (for now). I'd like to implement constant streaming eventually (chunks loaded as they are approached), but I want to get this part down first.

UPDATE: Instantiated the second ContentManager using this.Services inside the Game class (it was the only way I could find to get access to Game.Services, which is what everywhere online says to use in the ContentManager constructor). Should have thought of that sooner. For anyone confused by this in the future, the full line of code is:

ContentManager myContent = new ContentManager(this.Services, "myContent")

• You can inherit from ContentManager and override Load method and implement it in a way that doesnt add anything to loadedAssets Dictionary, and add it to your own dictionary so that you can remove assets from there later (or use refleciton to remove assets from loadedAssets dictionary...) – Kikaimaru Feb 13 '13 at 8:37
• This answer suggests that deriving your own myContentManager class from the original is more complicated than necessary. I just figured out how to instantiate a new ContentManager, finally (in the Game class, using new ContentManager(this.Services, "Textures")). I'll pass that through to the LevelManager and into the MapFactory when new maps are loaded... I think. – Sasquatch Feb 14 '13 at 0:17
• Ehm, no it does not. "Either way you'll be creating a second instance of ContentManager (or a class derived from it)". But it may be easier, but you have to know form which contentmanager you want to load your assets - which you probably do. On the otherside with custom content loader, you would have to know when to unload specific assets, maybe counting how many instances you are using. – Kikaimaru Feb 14 '13 at 8:38

• Yeah, I'm creating a second contentManager (named "mapContent" for clarity) to hold everything specific to whatever map is being loaded. If I understand correctly, I should be able to call Unload() on it to dump everything and reload just what the next map requests. And yeah, my MapFactory has a LoadXml(string filename) method that uses XmlReader to parse the file. – Sasquatch Feb 15 '13 at 5:07