我正在尝试使用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。
答案 0 :(得分:1)
在调用SetData()之前,您需要:
GraphicsDevice.Textures[0] = null;
要修改纹理的某些部分,请使用SetData()的Rectangle重载。
SetData<T>(int mipmapLevel, Rectangle? rect, Color[] data, int startIndex, int elementCount)
使用矩形来定位要更改的像素,为0
传递startIndex
,elementCount
为rect.Width * rect.Height
答案 1 :(得分:0)
让我们分开方法:
SetData<T>(T[], Int32, Int32)
因为该方法告诉您,您需要指定一个类型,并提供所述类型的数组。 然而你正在为它提供一个类型的数组,所以它需要一个看起来像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);
让我知道这是否有效回答了你的问题。