CodeGo.net>我如何在我的班上正确实现Dispose()?
作者:互联网
我正在寻找有关如何以及何时实施处置模式的建议.
我已经阅读了有关如何实现Dispose()模式的MSDN文章.这说得通.我在课堂上实现了它,但似乎对内存使用没有影响.
有点背景,我正在构建一个2d自上而下的游戏引擎.我有一个叫Gatherer的单元,它继承自Actor(一个用于绘制精灵和跟踪视平面的基本类),它们是可以执行操作的简单精灵.他们经过5轮游戏后消失了.
我使用一个列表来跟踪收集器,实现如下:
List<Gatherer> gatherList = new List<Gatherer>();
然后,我在游戏引擎中修剪以下列表:
public void pruneDeadFollowers()
{
for (int i = gatherList.Count-1; i> -1; i--)
{
if (gatherList[i].timeToDie) //Bool to check if unit needs to be removed this round.
{
this.dropActor(gatherList[i]); //Calls method that unsubscribes the object from triggered events.
gatherList[i].Dispose(); //Is this needed?
gatherList.RemoveAt(i); //Remove from list.
}
}
}
Gatherer对象非常简单.它主要具有托管对象.
它有很多Int字段,几个List,几个Point(来自Monogame),几个Bool对象和几个Static Int.
我也有随机r;在运行时创建的,但似乎没有Dispose方法.
我仅有的非托管对象是2个Texture2D对象.
公共Texture2D glowTexture;
公共Texture2D texImage;
在处理过程中,我认为我只需要处理纹理.
一个问题是,如果我实际调用texImage.Dispose();它会破坏其他仍然存在的单元的纹理.我想我可以只使纹理为Null,这不会影响现有的单位.
我有这样的处置:够了吗?如果没有,我如何验证是否可以正常工作?
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
glowTexture = null;
texImage = null;
}
disposed = true;
}
解决方法:
您的实现是有效的,但还不够.
如您所知,Dispose用于释放非托管资源.最初的实现(使用纹理后处置纹理的位置)是正确的.
除了要在多个对象之间共享这些资源外,因此您不希望使用纹理的对象控制其寿命.
我会遵循XNA中的模式.加载内容的人也需要卸载它.在您的情况下,创建纹理的人(以及子对象)都应在处理后对其进行处理.从我所见,使用纹理的子对象实际上根本不需要实现IDisposable.
标签:monogame,dispose,c 来源: https://codeday.me/bug/20191028/1954729.html