我正在将一个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),所以我想这个方法已经出来了。有什么想法吗?
感谢您的帮助!
答案 0 :(得分:1)
只是一个建议。
Texture2D
(MSDN)类实现IDisposable
,因此您可以在不再需要时在纹理上运行Dispose
方法。这将释放纹理使用的任何非托管资源,并可能释放内存。
答案 1 :(得分:0)
尝试在Update方法的末尾添加filledMap.Dispose()
。