我正在寻找关于如何以及何时实现dispose模式的建议。
我已经阅读了MSDN关于如何实现dispose()模式的文章。说得通。我在我的类中实现了它,但它似乎对内存使用没有什么影响。
有点背景,我正在建立一个2D自顶向下的游戏引擎。我有一个名为Gatherer的单元,它继承自Actor(一个用于绘制sprite和跟踪viewplane的基本类),它们是一些简单的sprite。它们在5轮比赛后消失。
我使用一个列表来跟踪Gatherer,实现方式如下:
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对象和几个静态Int。我也有随机R;在运行时创建,但它似乎没有Dispose方法。我唯一的非托管对象是2个Texture2D对象。公共纹理2D发光纹理;公共文本二维文本图像;
在我的dispose中,我认为我只需要处理纹理。
一个问题是,如果我实际调用texImage.dispose();它破坏了其他还活着的单位的纹理。我想我可以只是使纹理空代替,这不影响现有的单位。
我有这样的想法:这足够吗?如果不是,我如何验证它是否正常工作?
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
。