[设置纹理时内存泄漏=新的Texture2D(…)

问题描述 投票:0回答:2

我将以下代码作为游戏的一部分:

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.Black);

        spriteBatch.Begin();

        terrainSprite.Draw(spriteBatch);

        if (resourceMap.pixels.IsDisposed == false)
        {
            resources.Draw(spriteBatch, spriteFont);
        }

        spriteBatch.End();

        base.Draw(gameTime);

       //Disposes the texture here:
        resources.pixels.Dispose();
    }

    //In the resources class
    public void Update()
    {       
        //gD = graphics device
        pixels = new Texture2D(gD, 800, 353);

        //big update method
        //manipulate the pixels texture
    }

[当我打开任务管理器并查看资源监视器时,'myGame.exe'的内存使用量持续增加约8 KB(我意识到这很小,但是我的游戏保存了很多数据,因此请保存每一个我能做到的一点点很重要,而且它很快就会建立起来)。这是在所有其他代码都被注释掉之后的代码,除了此处显示的内容。然后,当我注释掉代码:“ pixels = new Texture2D(gD,800,353);”时,内存使用保持不变。我也尝试了GC.Collect(),但是没有骰子。

还有其他方法可以阻止它吗? (抱歉,摆脱代码不是一种选择:p,更新纹理的速度比我遇到的使纹理变为空白的任何其他方法快得多)

c# performance xna garbage-collection xna-4.0
2个回答
2
投票

[取决于您的Game配置,实际上,还有许多其他因素,例如一切运行的缓慢程度等,UpdateDraw不能完全同步,并且不保证可以以以下方式运行:

Update
Draw
Update
Draw
Update
Draw
Update
Draw
....

因此,由于您在其中一个Dispose中并在另一个中创建了一个[[brand new],因此肯定会发生类似的事情:Update: create new Update: create new //PREVIOUS ONE LEAKED! Draw: disposes only current Update: create new Update: create new //AGAIN LEAK Draw: disposes only current ...

因此,请勿以这种方式单独DisposeDispose每创建一个新对象,一次,无论如何。

我还应该补充一点,纹理以及其他一些XNA类(声音和音乐以及Effect,仅举几例)是

unmanaged

资源,这意味着GC根本看不到它们。您必须在这些电话上致电Dispose正如安德鲁(Andrew)在其评论中指出的,避免这些陷阱的最佳方法是不要如此频繁地重新创建纹理-只需重复使用相同的纹理并按您认为合适的方式对其进行修改。

0
投票
看来,Texture2D未被垃圾收集器完全处理。
© www.soinside.com 2019 - 2024. All rights reserved.