2015-11-18 57 views
1

我試圖用SetData<T>(T[], Int32, Int32)設置一個Texture2D的數據,但不管是什麼,我把作爲變量,我總是得到的Texture2D的SetData <T>(T [],的Int32,Int32)將AccessViolationException

AccessViolationException:嘗試讀取或寫入受保護的內存。這通常表明其他內存已損壞。

我已經嘗試使用Microsoft.Xna.Color[]byte[]作爲T,但同樣的錯誤發生。 SetData<T>(T[])沒有錯誤,但我想通過使用SetData<T>(T[], Int32, Int32)來提高性能。

我使用Visual Studio 2013與.NET 4.5.1和monogame。

回答

0

讓我們分裂的方法:

SetData<T>(T[], Int32, Int32) 
  • SetData的 - 方法名稱
  • 筆 - 任何你想要的類型(在這種情況下,XNA顏色類型)
  • T [] - 一個您指定類型的數組。
  • 的Int32 X2 - 兩個Int32值,即寬度和高度

因此,作爲方法告訴你,你需要指定一個類型,並提供一系列所述類型。 但是你提供了一個類型的數組,所以它需要一個看起來像T [] []的參數(這是一個編譯有效的參數,它是一個T數組的數組)。但是,當你只提供一個標準的數組時,就是在抱怨的時候。

只要你的陣列包含的條目寬*高(如array.Length == 1024×1024)。

總結:以在方法構造一個良好的很難看東西時不合理。

@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); 

讓我知道這是否回答你的問題。

+0

對不起,我應該更清楚。我的意思是我傳遞一個'Color'數組,像這樣:'Color [] theColor = new Color [1]; theColor [0] = Color.Black; theTexture.SetData (theColor,startIndex,elementCount);'但不管我爲startIndex和elementCount放置了什麼,我總是得到錯誤。我可以使用'theTexture。SetData (colorArray);'其中colorArray是一個長度數組(theTexture.Widht * theTexture.Height)。 – applepie9883

+0

@ applepie9883我編輯了答覆(希望)回答你的實際問題。 – Falgantil

+0

這幾乎是我目前正在做的,它確實有效,但我想使用'SetData (T [],Int32,Int32)',因爲我認爲這會比更新整個圖像更快。 (我必須更新每個勾號的圖像部分) – applepie9883

1

調用的SetData()之前,你需要:

GraphicsDevice.Textures[0] = null; 

要修改紋理的部分,使用的SetData的矩形超載()。

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

使用矩形定位的像素改變,通過0startIndexelementCountrect.Width * rect.Height

相關問題