2011-09-13 28 views
1

我有一個來自Kinect的視頻流。它的數據以32位BGRX格式打包。我想直接將這些數據轉移到Texture2d中,但我找不到匹配的SurfaceFormat。我能找到的最接近的是SurfaceFormat.Color,它看起來是32位RGBX。XNA是否有BGRA/BGRX表面格式?

假設沒有兼容的格式。什麼是數據轉換和推到一個紋理2D最快的方式

我在想這樣的事情將是一件好事,但它似乎幀率減慢:

編輯:我改變了算法有點現在它似乎正在運行得體。

void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e) 
    { 
     byte x; 
     for (int i = 0; i < e.ImageFrame.Image.Bits.Length; i += 4) 
     { 
      x = e.ImageFrame.Image.Bits[i]; 
      e.ImageFrame.Image.Bits[i] = e.ImageFrame.Image.Bits[i + 2]; 
      e.ImageFrame.Image.Bits[i + 2] = x; 
     } 
     canvas.SetData(e.ImageFrame.Image.Bits); 
    } 

回答

0

這是最快的事我已經能夠想出:

void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e) 
    { 
     byte[] bits = e.ImageFrame.Image.Bits; 
     for (int i = 0; i < bits.Length; i += 4) 
     { 
      frameBuffer[i] = bits[i + 2]; 
      frameBuffer[i + 1] = bits[i + 1]; 
      frameBuffer[i + 2] = bits[i]; 
     } 
     canvas.SetData(frameBuffer); 
    } 

沒有在所有參與我得到的4200

一個幀率直接移動字節到Kinect的texture2d沒有糾正格式差異產量:3100

如果你給自己一個局部變量與e.ImageFrame.Image.Bits和複製字節到一個預先分配的緩衝區f ixing字節,當您去我得到:2700

的算法我已經在我原來的問題一一列出,只需更換位的地方,然後發送到的Texture2D產量約750

所以回顧一下改變這個算法碰撞幀率從750增加到2700