其他分享
首页 > 其他分享> > CodeGo.net>我如何在我的班上正确实现Dispose()?

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