【问题标题】:MonoGame - Dispose Texture2DMonoGame - 处理 Texture2D
【发布时间】:2018-07-23 22:25:27
【问题描述】:

几天前我玩了 MonoGame 框架。 我构造了跟随类:

public Texture2D Texture2D { get; set; }
public Vector2 Vector2;

public Point(Texture2D texture2D, Vector2 vector2)
{
    Texture2D = texture2D;
    Vector2 = vector2;
}

public void SetX()
{
    if(Vector2.X > -50)
    {
        Vector2.X = Vector2.X-2;
    }
}

然后我创建了两个以上的对象并将它们添加到一个列表中:

_points.Add(new Models.Point(Content.Load<Texture2D>("Point"), new Vector2(50, 50));

当我处置其中一个时,所有纹理都将被处置。 我怎样才能只处置这两个对象之一?

【问题讨论】:

  • 发布你的处理代码(你调用.Dispose()using块)另外,如果你的两个Point对象使用相同的Texture2D,只需加载一次,不要创建单独的实例。
  • 处置其中一个只会处置那个。所以你必须手动处理它们。

标签: c# dispose monogame texture2d


【解决方案1】:

作为一般规则,负责处理某些东西的类应该是创建它的同一个类。这条规则也有例外,但一般来说,如果它成立,这样的问题就会更容易推理。

具体来说,在这种情况下,您似乎误解了 MonoGame 中通常如何处理纹理。基本上有两种选择:

  1. 使用Content.Load&lt;Texture2D&gt; 使用内容管理器创建的纹理由内容管理器处理(换句话说,您不应该直接在这些纹理上调用Dispose
  2. 您自己使用new Texture2D 创建的纹理是您的责任(在这种情况下,您应该直接致电Dispose

另外需要注意的是,多次调用Content.Load&lt;Texture2D&gt;("Point") 实际上会返回对same 纹理的引用。这通常被认为是一件好事,因为它只会将纹理加载到内存中一次。

如果您确实希望多次将相同的纹理加载到内存中,则需要自己处理。不过,您很少会想要这样做,因此请确保您首先了解其中的含义。

为了证明这一点,请考虑以下代码:

var texture1 = Content.Load<Texture2D>("Point"); // load texture into memory
var texture2 = Content.Load<Texture2D>("Point"); // get a reference to the same texture

此时texture1texture2将是同一个实例。如果您更改其中之一,您将同时更改两者。

稍后当您的游戏在 Game 类的深处某个地方关闭时,Content 经理将 Dispose。这是纹理将被释放的时候。您无需自己执行此操作。

【讨论】:

  • 感谢您的帮助。现在我了解了内容管理器的工作原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2014-11-22
相关资源
最近更新 更多