Texture2D SetData <t>(T [],Int32,Int32)AccessViolationException

时间:2015-11-18 00:02:10

标签: c# .net xna

我正在尝试使用SetData<T>(T[], Int32, Int32)设置Texture2D的数据,但无论我把它作为变量,我总是得到

  

AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

我已尝试将Microsoft.Xna.Color[]byte[]用于T,但会出现同样的错误。 SetData<T>(T[])可以正常运行,但我希望改为使用SetData<T>(T[], Int32, Int32)来改善效果。

我正在使用Visual Studio 2013和.NET 4.5.1以及monogame。

2 个答案:

答案 0 :(得分:1)

在调用SetData()之前,您需要:

GraphicsDevice.Textures[0] = null;

要修改纹理的某些部分,请使用SetData()的Rectangle重载。

SetData<T>(int mipmapLevel, Rectangle? rect, Color[] data, int startIndex, int elementCount)

使用矩形来定位要更改的像素,为0传递startIndexelementCountrect.Width * rect.Height

答案 1 :(得分:0)

让我们分开方法:

SetData<T>(T[], Int32, Int32)
  • SetData - 方法名称
  • T - 您想要的任何类型(在本例中为XNA颜色类型)
  • T [] - 您指定类型的数组。
  • Int32 x2 - 两个Int32值,即Width和Height

因为该方法告诉您,您需要指定一个类型,并提供所述类型的数组。 然而你正在为它提供一个类型的数组,所以它需要一个看起来像T [] []的参数(这是一个编译有效的参数。它是一个T数组的数组)。但是,当你只提供一个标准数组时,那就是它抱怨的时候。

只要您的数组包含与Width * Height一样多的条目(例如,array.Length == 1024x1024)

总结:当事情没有意义时,请仔细研究方法结构。

@Edit:尝试做这样的事情:

Texture2D myTexture = new Texture2D(this.GraphicsDevice, 1024, 1024);
Color[] theColors = new Color[myTexture.Width * myTexture.Height];

// Loop through each color object and define it.

myTexture.SetData<Color>(theColors);

让我知道这是否有效回答了你的问题。