如何从内容管理器中卸载内容?

时间:2010-11-24 09:03:32

标签: xna content-management

我尝试在texture2d上使用dispose函数,但这会导致问题,我很确定这不是我想要使用的。

我应该使用什么来基本上卸载内容?内容管理员是否跟踪自己或者我必须做些什么?

2 个答案:

答案 0 :(得分:12)

查看我的答案here,可能还有here

ContentManager“拥有”它加载的所有内容,并负责卸载它。您应该卸载ContentManager加载的内容的唯一方法是使用ContentManager.Unload()MSDN)。

如果您对ContentManager的此默认行为不满意,可以按this blog post中所述替换它。

您自己创建而不通过ContentManager创建的任何纹理或其他可卸载资源都应在Dispose()函数中处理(通过调用Game.UnloadContent

答案 1 :(得分: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();
    }