[英]MonoGame - Dispose 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;
}
}
然后,我创建了两个以上的对象并将它们添加到列表中:
_points.Add(new Models.Point(Content.Load<Texture2D>("Point"), new Vector2(50, 50));
当我处理其中之一时,将处理所有纹理。 如何仅处置两个对象之一?
通常,负责处理某事的类应与创建它的类相同。 该规则有一些例外,但是通常,如果它成立,它将使诸如此类的问题更容易推论。
特别是在这种情况下,您似乎误解了MonoGame中通常如何处理纹理。 基本上有2种选择:
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
。 这是纹理将被释放的时间。 您无需自己执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.