2010-11-24 83 views
9

我試過在texture2d上使用dispose函數,但是這導致了問題,我很確定這不是我要使用的。如何從內容管理器中卸載內容?

我應該用什麼來基本卸載內容?內容管理者是否保持自己的追蹤或是否有我需要做的事情?

+0

可能重複如何XNAs Content.Load operations?](http://stackoverflow.com/questions/4242741/how-does-xnas-content-loadtexture2d-operate) – 2010-11-24 10:34:41

回答

12

看看我的答案here和可能的here

ContentManager「擁有」它加載的所有內容並負責卸載它。您應該卸載ContentManager加載的內容的唯一方法是使用ContentManager.Unload()MSDN)。

如果您對ContentManager的此默認行爲不滿意,可以按照this blog post中所述將其替換。

自己創建任何紋理或其他卸載-能資源,而無需通過ContentManager應該(通過調用Dispose())在Game.UnloadContent功能配置。

+0

還有一個ContentManager.Unload(bool disposing),它被描述爲卸載託管內容if真正。 xna庫中是否有xna內容類型需要手動處理? – Wouter 2012-04-18 10:30:43

1

如果要處理紋理,最簡單的方法做到這一點:

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

如果你想退出遊戲後處置的所有內容,最好的辦法做到這一點:

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

如果你想退出遊戲後,僅設置質地:

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