2012-03-19 151 views
3

我有一個表示圖像的字節數組。將字節數組轉換爲texture2D XNA

每個字節表示特定像素的R,G或B的強度值(0-255)。因此,對於640x480圖像,字節數組的大小爲640 * 480 * 3(每個像素有3個字節表示它)。

字節按像素順序排列。例如:

image[0] = the R value of x=0 y=0 
image[1] = the G value of x=0 y=0 
image[2] = the B value of x=0 y=0 
image[3] = the R value of x=1 y=0 

等等。

我想知道什麼是最有效的方式來畫這在XNA屏幕是?

我的想法是要做到以下幾點。

  1. 創建一個新的Texture2D對象
  2. 在draw()方法,通過字節數組迴路和Texture2D對象
  3. 畫出此填充在對象在屏幕上設置的值。

這是最快的方法嗎?如果效率更高,我還可以以不同的順序/格式存儲字節數組。在draw()方法中執行循環有什麼缺點嗎?在更新()期間執行它會更好嗎?

編輯:

我試圖在一個Texture2D使用使用setData()序每一次我的字節數組更新(通常一次幀)創建一個新的紋理。 fps現在低於15,而之前是60.代碼如下:

public static Texture2D getImageFrame(GraphicsDevice gd) 
    { 
     if (cameraTex == null) 
     { 
      cameraTex = new Texture2D(gd, 640, 480, false, SurfaceFormat.Color); 
     } 
     cameraTex.SetData(imageFrame); 
     return cameraTex; 
    } 

這被稱爲每個draw()循環。

當然,必須有一個更有效的方法來做到這一點?

+0

我強烈建議考慮在開發此應用程序時考慮使用Flyweight模式作爲設計模式。我認爲你的一個更大的挑戰將是在你的繪製/更新的每次迭代中以時間敏感的方式對這些數據進行總體檢索/存儲。 HTTP://en.wikipedia。org/wiki/Flyweight_pattern – 2012-03-19 18:40:09

+0

在存儲字節數組方面,我沒有將它作爲一個對象傳遞。它是從另一個進程每幀更新,我正在尋找一種方法來將這些數據轉換爲每幀可繪製紋理2d。 – Jkh2 2012-03-19 18:55:47

+0

然後你可能想用[SetData](http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.texture2d.setdata.aspx)做些什麼。 – thedaian 2012-03-19 19:15:35

回答

2

根據更新字節數組的方式(可能值得注意),可以使用使用索引和計數參數的SetData重載更新紋理的較小片段。

顯然,您需要添加一些方法來跟蹤哪些像素區域上次更改才能正常工作(同樣取決於您的程序結構)。無論如何,我最近在另一個紋理上繪製了血跡紋理,並且使用這種方法儘量減少了命中,從而獲得了類似的性能。

公共無效的SetData(T []數據,INT的startIndex,INT elementCount中)

公共無效的SetData(INT水平,可爲空的矩形,T []數據,INT的startIndex,INT elementCount中)

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.texture2d.setdata.aspx

+1

由於每次您調用Draw()函數時都會調用代碼,所以您也可以創建一個標誌,說明字節數組是否已實際更新,因此 if bytesUpdated) – kallotec 2012-03-20 19:57:28