2010-11-24 3 views
9

J'ai essayé d'utiliser la fonction dispose sur un texture2d mais cela a causé des problèmes et je suis sûr que ce n'est pas ce que je suis censé utiliser.Comment décharger le contenu du gestionnaire de contenu?

Que dois-je utiliser pour décharger le contenu? Le gestionnaire de contenu se surveille-t-il ou y a-t-il quelque chose que je dois faire?

+0

double possible de [Comment XNAs Content.Load fonctionner?] (Http://stackoverflow.com/questions/4242741/how-does-xnas-content-loadtexture2d-operate) –

Répondre

12

Jetez un oeil à mes réponses here et éventuellement here. Le ContentManager "possède" tout le contenu qu'il charge et est chargé de le décharger. La seule façon de décharger le contenu qu'un ContentManager a chargé est d'utiliser ContentManager.Unload() (MSDN).

Si vous n'êtes pas satisfait de ce comportement par défaut de ContentManager, vous pouvez le remplacer comme décrit dans this blog post.

Toutes les textures ou autres ressources déchargent-mesure que vous créez sans passer parContentManager doivent être éliminés (en appelant Dispose()) dans votre fonction Game.UnloadContent.

+0

Il existe également un ContentManager.Unload (bool disposal) qui est décrit comme déchargeant du contenu géré si vrai. Y a-t-il des types de contenu xna dans la bibliothèque xna qui sont gérés et doivent être éliminés manuellement? – Wouter

+1

@Wouter Unload ne prend aucun argument dans les versions que je vois sur MSDN. Vous pourriez regarder 'Dispose (bool disposing)' (qui est une méthode protégée, ne peut pas appeler en externe). Cela fait partie du modèle jetable standard C# ([expliqué ici] (http://msdn.microsoft.com/fr-fr/library/fs2xkftw.aspx)). 'Dispose (true)' est appelé pendant la disposition standard (l'instruction 'using' ou directement en appelant' Dispose() ') et appelle lui-même' Unload() '. 'Dispose (false)' est appelé par le finaliseur et n'appelle spécifiquement pas 'Unload' (il ne peut pas accéder à d'autres objets, ils ont peut-être déjà été finalisés). –

1

Si vous souhaitez disposer d'une texture, la meilleure façon de le faire:

SpriteBatch spriteBatch; 
    Texture2D texture; 
    protected override void LoadContent() 
    { 
     spriteBatch = new SpriteBatch(GraphicsDevice); 
     texture = Content.Load<Texture2D>(@"Textures\Brick00"); 
    } 
    protected override void Update(GameTime gameTime) 
    { 
     // Logic which disposes texture, it may be different. 
     if (Keyboard.GetState().IsKeyDown(Keys.D)) 
     { 
      texture.Dispose(); 
     } 

     base.Update(gameTime); 
    } 
    protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.CornflowerBlue); 
     spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearWrap, DepthStencilState.None, RasterizerState.CullCounterClockwise, null); 

     // Here you should check, was it disposed. 
     if (!texture.IsDisposed) 
      spriteBatch.Draw(texture, new Vector2(resolution.Width/2, resolution.Height/2), null, Color.White, 0, Vector2.Zero, 0.25f, SpriteEffects.None, 0); 

     spriteBatch.End(); 
     base.Draw(gameTime); 
    } 

Si vous souhaitez disposer tout le contenu après la sortie du jeu, la meilleure façon de le faire:

protected override void UnloadContent() 
    { 
     Content.Unload(); 
    } 

Si vous souhaitez disposer la texture seulement après la sortie du jeu:

protected override void UnloadContent() 
    { 
     texture.Dispose(); 
    }