MonoGame - 处理Texture2D

时间:2018-02-13 14:05:45

标签: c# dispose monogame texture2d

几天前,我玩过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;
    }
}

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

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

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

1 个答案:

答案 0 :(得分:2)

作为一般规则,负责处理某事的类应该与创建它的类相同。这条规则有例外,但一般情况下如果它成立,它会使这样的问题更容易推理。

具体来说,在这种情况下,您似乎误解了MonoGame中纹理的正常配置方式。基本上有两种选择:

  1. 内容管理器使用Content.Load<Texture2D>创建的内容管理器创建的纹理(换句话说,您不应该直接在这些纹理上调用Dispose
  2. 您自己使用new Texture2D创建的纹理是您可以自行处理的(在这种情况下,您直接调用Dispose
  3. 另外需要注意的是,多次调用Content.Load<Texture2D>("Point")实际上会返回对相同纹理的引用。这通常被认为是一件好事,因为它只会将纹理加载到内存中一次。

    如果您确实希望将相同的纹理多次加载到内存中,则需要自己处理。虽然,您很少想要这样做,但请务必先了解其含义。

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

    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。这是纹理释放的时候。你自己不需要这样做。