簡體   English   中英

將字節數組轉換為texture2D XNA

[英]Converting byte array into 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()方法中進行循環是否有任何缺點? 在update()期間做它會更好嗎?

編輯:

我試圖在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()循環。

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

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

顯然,您需要添加一些跟蹤像素區域最后更改的方法(再次取決於程序的結構)。 在任何情況下,我最近都在另一個紋理上繪制了一個血液飛濺紋理,並且使用這種方法設法減少了命中率。

public void SetData(T [] data,int startIndex,int elementCount)

public void SetData(int level,Nullable rect,T [] data,int startIndex,int elementCount)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM