几天前,我玩了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));当我发现其中一个时,所有的纹理都会被处理掉。如何只处理这两个对象中的一个?
发布于 2018-02-13 23:47:39
作为一般规则,负责处理某物的类应该是创建它的同一个类。这条规则有一些例外,但通常情况下,如果它成立,就会使这样的问题更容易解释。
在本例中,您似乎误解了通常在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。此时纹理将被释放。你不需要自己动手。
https://stackoverflow.com/questions/48768690
复制相似问题