XNA new Texture2D保留旧数据

本文关键字:数据 保留 Texture2D new XNA | 更新日期: 2023-09-27 18:03:56

我有一个奇怪的问题,我相信我对XNA框架的知识相对缺乏使我无法解决。

基本上我有一个Texture2D的引用被设置为Texture2D的一个新实例。在运行时,它的一些像素被设置,这一切都很好地在游戏循环中绘制。

奇怪的是,如果我将引用设置为null,(它只会在不为空的情况下绘制),它不会像预期的那样绘制。

之后,我将引用设置为一个新的Texture2D,并开始将其绘制到屏幕上。问题是它保存了原始Texture2D对象的所有数据。

编辑

对不起,我之前没说清楚。

我有的东西是这样的…

private Texture2D WorkingTexture {get; set; }
private void Update()
{
 if(some input)
 {
  this.WorkingTexture = null;
 }
 if(some other input)
 {
  this.WorkingTexture = new Texture2D(this.GraphicsDevice, 500, 500, true, SurfaceFormat.Color);
  this.WorkingTexture.SetData<Color>(0, new Rectangle((int)vector2.X, (int)vector2.Y, 4, 4), colors, 0, 16);
  }
}
private void Draw()
{
 if (this.WorkingTexture != null)
 {
    spritebatch.draw(this.WorkingTexture,.....);
 } 
}

第二个编辑

我还设置了for循环,并在创建纹理后手动设置纹理的每个像素的颜色。这是可行的,但它仍然显示像素为我之前设置的颜色。这很奇怪。


请忽略这个线程。这件事是我自己干的,很尴尬。我有一些代码,缓冲像素的变化,是的……你猜我没有清除它,它在新的纹理实例上重新做了一遍。

很尴尬…

XNA new Texture2D保留旧数据

在没有太多细节的情况下,听起来好像您正在尝试用之前所做的更改加载Texture2D。由于您将其设置为null,当您重新加载Texture2D时,它将恢复到原始状态。如果您想再次使用它,您需要保存对像素所做的更改以供以后使用。希望这对你有帮助!

你已经建立了一个像这样的纹理

Texture2D texture = Content.Load<Texture2D>("texture_name");

然后应用一个新的引用,像这样

texture = Content.Load<Texture2D>("other_texture_name");

对吧?

不应该是这样的。你必须设置你的GraphicsDevice来使用特定的纹理。对于BasicEffect类,应该是这样的:

BasicEffect effect = new BasicEffect(GraphicsDevice);
effect.Texture = texture;
effect.CurrentTechnique.Passes[0].Apply();

如何创建纹理?如果你从一个资源(texture = Content.Load("texture_name"))加载它们,你所描述的问题听起来像是你的逻辑中的一个bug:你的程序没有做你认为它正在做的事情。跟踪、调试…

如果你正在创建全新的纹理(纹理= new Texture2D(…)),这是可能的(未验证),新的纹理没有初始化,其内存空间正在从某种内存池中检索,所以检索最近标记处置纹理数据。尝试在创建纹理数据后立即初始化它,例如将其设置为全黑。