如何释放Texture2D数据/内存? XNA

时间:2013-02-27 21:27:42

标签: c# memory-leaks xna-4.0

我正在将一个Texture2D绘制到屏幕上。此纹理以空白(完全透明)800 * 350纹理开始。此纹理从LoadContent加载到两个不同的纹理,如blankTexture和filledTexture。然后我在更新方法中将像素绘制到filledTexture。使用精灵批处理绘制filledTexture,然后重复该过程。

fillTexture在每次更新调用开始时“更新”,以除去那里的像素,因此可以重新填充。我发现更新纹理根本没有正确摆脱旧数据,这就开始了问题。首先,我尝试在每次调用开始时将filledTexture =设置为blankTexture,但这仍然保留了前一次调用的数据。然后我尝试了以下内容:

    public void LoadContent(graphicsDeviceManager graphics, ContentManager content)
    {
        //some code

        blankTexture = content.Load<Texture2D>("blank");
        filledTexture = content.Load<Texture2D>("blank");

        //some more code
    }

   public void Update()
   {       
        filledMap = new Texture2D(graphicsDevice.GraphicsDevice, blankMap.Width, blankMap.Height);

        //some code that messed around with the pixel locations
        Color[] color = new Color[1];
        color[0] = someNewColor;
        //some code that set the new position of the pixel

        //where R is a 1x1 rectangle with some location
        //this sets one pixel of the filledMap at a time at R.Location
        filledMap.SetData(0, R, color, 0, 1);


   }

   public void Draw(SpriteBatch batch)
   {
         batch.Draw(filledMap);
   }

现在,这些方法运行良好。除此之外,每20秒左右,帧速率将下降约20至30点,然后恢复正常。我不可能看到这样的原因,因为所有代码路径都在不断运行,像素数量以恒定速率上升并保持不变,因此帧丢失不会那么不一致。

我打开了任务管理器,查看了物理内存,aaa并且结果显示RAM正在填充并每隔20秒左右倾倒一次。在每次更新开始时注释掉将fillMap设置为新Texture2D的代码行后,内存泄漏消失了(大约1.5 gigs被填充并每20秒抛出一次)。所以我需要一些关于如何正确清理内存的想法!使用texture.SetData的帧速率太高(它会快速下降到大约2 FPS),所以我想这个方法已经出来了。有什么想法吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

只是一个建议。

Texture2DMSDN)类实现IDisposable,因此您可以在不再需要时在纹理上运行Dispose方法。这将释放纹理使用的任何非托管资源,并可能释放内存。

答案 1 :(得分:0)

尝试在Update方法的末尾添加filledMap.Dispose()