MonoGame - 处理 Texture2D

MonoGame - Dispose Texture2D

前几天玩了一下MonoGame Framework。 我构造如下 class:

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;
    }
}

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

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

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

作为一般规则,负责处置某物的 class 应该与创建它的 class 相同。这条规则也有例外,但一般来说,如果它成立,就会使此类问题更容易推理。

在这种情况下,您似乎误解了纹理在 MonoGame 中的正常处理方式。基本上有 2 个选项:

  1. 内容管理器使用 Content.Load<Texture2D> 创建的纹理由内容管理器处理(换句话说,您 不应该 在这些上调用 Dispose直接贴图)
  2. 您自己使用 new Texture2D 创建的纹理是您负责处理的(在这种情况下,您 应该 直接调用 Dispose

另一件需要注意的事情是,多次调用 Content.Load<Texture2D>("Point") 实际上会 return 引用 相同的 纹理。这通常被认为是一件好事,因为它只会将纹理加载到内存中一次。

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

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

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 class 深处的某个地方关闭时,Content 经理将 Dispose。这是纹理将被释放的时候。您不需要自己执行此操作。