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 个选项:
- 内容管理器使用
Content.Load<Texture2D>
创建的纹理由内容管理器处理(换句话说,您 不应该 在这些上调用 Dispose
直接贴图)
- 您自己使用
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
此时texture1
和texture2
将是同一个实例。如果您更改其中之一,则同时更改两者。
稍后当您的游戏在 Game
class 深处的某个地方关闭时,Content
经理将 Dispose
。这是纹理将被释放的时候。您不需要自己执行此操作。
前几天玩了一下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 个选项:
- 内容管理器使用
Content.Load<Texture2D>
创建的纹理由内容管理器处理(换句话说,您 不应该 在这些上调用Dispose
直接贴图) - 您自己使用
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
此时texture1
和texture2
将是同一个实例。如果您更改其中之一,则同时更改两者。
稍后当您的游戏在 Game
class 深处的某个地方关闭时,Content
经理将 Dispose
。这是纹理将被释放的时候。您不需要自己执行此操作。