首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoGame - Dispose Texture2D

MonoGame - Dispose Texture2D
EN

Stack Overflow用户
提问于 2018-02-13 14:05:45
回答 1查看 1.4K关注 0票数 1

几天前,我玩了MonoGame框架。我构造了以下课程:

代码语言:javascript
复制
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;
    }
}

然后,我创建了多个对象,并将它们添加到列表中:

代码语言:javascript
复制
_points.Add(new Models.Point(Content.Load<Texture2D>("Point"), new Vector2(50, 50));

当我发现其中一个时,所有的纹理都会被处理掉。如何只处理这两个对象中的一个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-13 23:47:39

作为一般规则,负责处理某物的类应该是创建它的同一个类。这条规则有一些例外,但通常情况下,如果它成立,就会使这样的问题更容易解释。

在本例中,您似乎误解了通常在MonoGame中处理纹理的方式。基本上有两种选择:

  1. 内容管理器使用Content.Load<Texture2D>创建的纹理由内容管理器处理(换句话说,您不应该直接调用这些纹理的Dispose )
  2. 使用new Texture2D自己创建的纹理是您处置的责任(在这种情况下,您应该直接调用Dispose )

另外要注意的是,多次调用Content.Load<Texture2D>("Point")实际上将返回对同一纹理的引用。这通常被认为是一件好事,因为它只会将纹理加载到内存一次。

如果您确实希望将相同的纹理多次加载到内存中,则需要自己处理。尽管如此,您很少会想要这样做,所以请确保您首先了解其含义。

为了演示这一点,请考虑以下代码:

代码语言:javascript
复制
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。此时纹理将被释放。你不需要自己动手。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48768690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档