[设置纹理时内存泄漏=新的Texture2D(…)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[设置纹理时内存泄漏=新的Texture2D(…)相关的知识,希望对你有一定的参考价值。
我将以下代码作为游戏的一部分:
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(我意识到这很小,但是我的游戏保存了很多数据,因此请保存每一个我能做到的一点点很重要,而且它很快就会建立起来)。这是在所有其他代码都被注释掉之后的代码,除了此处显示的内容。然后,当我注释掉代码:“ pixels = new Texture2D(gD,800,353);”时,内存使用保持不变。我也尝试了GC.Collect(),但是没有骰子。
还有其他方法可以阻止它吗? (抱歉,摆脱代码不是一种选择:p,更新纹理的速度比我遇到的使纹理变为空白的任何其他方法快得多)
[取决于您的Game
配置,实际上,还有许多其他因素,例如一切运行的缓慢程度等,Update
和Draw
不能完全同步,并且不保证可以以以下方式运行:
Update
Draw
Update
Draw
Update
Draw
Update
Draw
....
因此,由于您在其中一个Dispose
中并在另一个中创建了一个[[brand new],因此肯定会发生类似的事情: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
,仅举几例)是
unmanaged
资源,这意味着GC根本看不到它们。您必须在这些电话上致电Dispose
。正如安德鲁(Andrew)在其评论中指出的,避免这些陷阱的最佳方法是不要如此频繁地重新创建纹理-只需重复使用相同的纹理并按您认为合适的方式对其进行修改。以上是关于[设置纹理时内存泄漏=新的Texture2D(…)的主要内容,如果未能解决你的问题,请参考以下文章