设置纹理时内存泄漏 = 新的纹理 2D(..)



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

    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(我意识到这很小,但我的游戏包含大量数据,因此保存我能保存的每一点都很重要,而且它建立得相当快(。这是在除此处显示的内容之外的所有其他代码都被注释掉之后。然后,当我注释掉代码:"像素=新的Texture2D(gD,800,353(;"时,内存使用量保持不变。我也尝试了GC。收集((,但没有骰子。

我还能做些什么来阻止它吗?(抱歉,摆脱代码不是一个选项:p,更新纹理比我遇到的任何其他使纹理变为空白的方法都要快得多(

根据您的Game配置以及许多其他因素(例如所有内容的运行速度等(,UpdateDraw彼此之间并不完全同步,并且不保证以以下方式运行:

Update
Draw
Update
Draw
Update
Draw
Update
Draw
....
因此

,由于您Dispose一个并在另一个中创建全新的,因此肯定会发生这样的事情:

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
...

因此,不要以这种方式单独Dispose; 无论如何,每创建一个新创建一次,Dispose一次。

我还应该补充一点,纹理以及其他一些 XNA 类(声音和音乐,以及 Effect s,仅举几例(是非托管资源,这意味着 GC 根本看不到它们。您必须就这些致电Dispose

正如Andrew在他的评论中指出的那样,避免这些陷阱的最佳方法是不要经常重新创建纹理 - 只需重复使用相同的纹理并根据需要对其进行修改即可。

垃圾

回收器似乎没有完全处理Texture2D。

因此,当您停止使用它时(当重用引用它的变量时,如此处或在 OnDestroy 回调期间(,您必须手动销毁纹理。这里:

if(pixels != null) {
  Destroy(pixels);
}
pixels = new Texture2D(gD, 800, 353);

最新更新