2010-11-24 3 views
9

Ich habe versucht, mit der Funktion dispose auf einem texture2d, aber das verursachte Probleme und ich bin mir ziemlich sicher, dass es nicht das ist, was ich verwenden soll.Wie entlade ich Inhalte aus dem Content Manager?

Was soll ich verwenden, um Inhalte grundsätzlich zu entladen? Verfolgt der Content Manager selbst oder gibt es etwas, was ich tun muss?

+0

möglich Duplikat von [Wie funktioniert XNAs Content.Load betreiben?] (Http://stackoverflow.com/questions/4242741/how-does-xnas-content-loadtexture2d-operate) –

Antwort

12

Werfen Sie einen Blick auf meine Antworten here und möglicherweise here.

Die ContentManager "besitzt" den gesamten Inhalt, den sie lädt und ist verantwortlich für das Entladen. Die einzige Möglichkeit, Inhalte, die ein ContentManager geladen hat, zu entladen, besteht darin, ContentManager.Unload() (MSDN) zu verwenden.

Wenn Sie mit diesem Standardverhalten von ContentManager nicht zufrieden sind, können Sie es wie in this blog post beschrieben ersetzen.

Irgendwelche Texturen oder andere Entlade-able Ressourcen, die Sie selbst ohne durch ContentManager gehen schaffen sollte (durch den Aufruf Dispose()) in Ihrer Game.UnloadContent Funktion entsorgt werden.

+0

Es gibt auch einen ContentManager.Unload (bool disposing), der beschrieben wird, wenn man auch verwalteten Inhalt entlädt wahr. Gibt es XNA-Inhaltstypen in der XNA-Bibliothek, die verwaltet werden und manuell entsorgt werden müssen? – Wouter

+1

@ Wouter Unload nimmt kein Argument in irgendeiner Version, die ich auf MSDN sehe. Sie könnten "Dispose (bool disposing)" betrachten (was eine geschützte Methode ist, die nicht extern aufgerufen werden kann). Dies ist Teil des standardmäßigen C# -Ausgabemusters ([hier erklärt] (http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx)). 'Dispose (true)' wird während der Standard-Disposition aufgerufen (die 'using'-Anweisung oder direkt 'Dispose()' aufrufen) und ruft selbst 'Unload()' auf. 'Dispose (false)' wird vom Finalizer aufgerufen und ruft insbesondere nicht 'Unload' auf (es kann nicht auf andere Objekte zugreifen, diese wurden möglicherweise bereits finalisiert). –

1

Wenn Sie eine Textur entsorgen wollen, ist der einfachste Weg, es zu tun:

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); 
    } 

Wenn Sie alle Inhalte nach Beenden des Spiels entsorgen wollen, ist der beste Weg, es zu tun:

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

Wenn Sie nur Textur entsorgen nach Beenden des Spiels:

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