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

本文关键字:数据 内存 XNA Texture2D 何释放 释放 | 更新日期: 2023-09-27 18:01:23

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

filledTexture在每次更新调用开始时被"更新",以摆脱那里的像素,因此可以重新填充。我发现更新纹理并不能很好地去除旧的数据,于是问题就出现了。首先,我尝试在每次调用开始时将fillledtexture =设置为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个点,然后恢复正常。我不可能看到这样做的原因,因为所有的代码路径都是不断运行的,像素的数量以恒定的速率上升并保持在那里,所以帧下降不会如此不一致。

我打开任务管理器,查看物理内存,结果发现RAM已经满了,大约每20秒就会自动转储一次。在每次更新开始时注释掉将fillledmap设置为新Texture2D的代码行后,内存泄漏就消失了(每20秒填充和转储大约1.5 gb)。所以我需要一些关于如何正确清理记忆的想法!使用纹理。SetData的帧率成本太高(它会很快下降到2 FPS),所以我猜这个方法已经过时了。什么好主意吗?

谢谢你的帮助!

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

只是个建议。

Texture2D (MSDN)类实现了IDisposable,所以当你不再需要它时,你可以在纹理上运行Dispose方法。这将释放纹理使用的任何非托管资源,并可能释放内存。

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