几天前,我玩过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));
当我处置其中一个时,所有纹理都将被丢弃。 我怎样才能只处理这两个对象中的一个?
答案 0 :(得分:2)
作为一般规则,负责处理某事的类应该与创建它的类相同。这条规则有例外,但一般情况下如果它成立,它会使这样的问题更容易推理。
具体来说,在这种情况下,您似乎误解了MonoGame中纹理的正常配置方式。基本上有两种选择:
Content.Load<Texture2D>
创建的内容管理器创建的纹理(换句话说,您不应该直接在这些纹理上调用Dispose
) new Texture2D
创建的纹理是您可以自行处理的(在这种情况下,您应直接调用Dispose
)另外需要注意的是,多次调用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
此时texture1
和texture2
将是同一个实例。如果您更改其中一个,则需要同时更改它们。
稍后当您的游戏在Game
课程的某个深处停留时,Content
经理会Dispose
。这是纹理释放的时候。你自己不需要这样做。