当前位置: 首页 > 知识库问答 >
问题:

如何在类中正确实现Dispose()?

麻鸿熙
2023-03-14

我正在寻找关于如何以及何时实现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;
}

共有1个答案

翁翰墨
2023-03-14

您的实现是有效的,但还不够。

Dispose用于释放非托管资源。您的初始实现(在使用纹理后处理纹理)是正确的。

只是您在多个对象之间共享这些资源,所以您不希望对象使用纹理来控制它们的生存期。

我会遵循XNA的模式。谁加载内容也需要卸载。在您的情况下,创建纹理(因此创建子对象)的人都应该在释放纹理时释放纹理。根据我所看到的,使用纹理的子对象实际上根本不需要实现IDisposable

 类似资料:
  • 我读到过,在中包含异步是async/await的反模式。下面的代码可以工作,但是我想知道如果没有中的,如何实现相同的结果。 谢了。

  • 我需要使用runOnUiThread来更新UI中的TextView,同时在从WebService获取一些字符串的工作线程中更新TextView。我看了一些其他的帖子,并试图实现提供的解决方案,但当我启动我的应用程序,它崩溃。我不太熟悉这个方法,所以我需要一些方向,如何解决这个问题。

  • 问题内容: 我正在使用python-spidermonkey,它在内部使用PyMapping_Check来识别用作全局对象(在rt.new_context(global)中)是否实现了映射协议。(这基本上是传递给python- spidermonkey的字典,因此javascript对python变量的访问受到限制。) 我无法在Python中找到映射协议的正式定义,因此我一直在尝试和尝试确定其中的

  • 我有一个android应用程序,我正在尝试在其中实现linkedIn登录。LinkedIn SDK已经成功集成,我正在获取用户信息以及电子邮件地址。 以下是我的应用程序在谷歌登录时的工作方式: 1)在手机上获取访问令牌 2)发送带有访问令牌的电子邮件地址到服务器 3) 用我通过谷歌的webapi收到的访问令牌获取用户的详细信息。 4) 如果回复电子邮件与从移动设备接收的电子邮件匹配,则检查该电子邮

  • 问题内容: 我上课很难。麻烦的是,我正在尝试将包裹中的一个成员写入对象,这是一个对象。的是,和对象()在列表中的。 以下是相关代码: 我在“ //帮助这里”标记了两个点,以了解如何正确地写包裹以及如何对其进行重建。如果经过(正确测试),我该如何正确执行? 问题答案: 你差点知道了! 您只需要做: 就这样! 对于您的Integer列表,您还可以执行以下操作: 它应该工作。