如何释放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
(MSDN)类实现了IDisposable
,所以当你不再需要它时,你可以在纹理上运行Dispose
方法。这将释放纹理使用的任何非托管资源,并可能释放内存。
尝试在Update方法的末尾添加filledMap.Dispose()