我有来自Kinect的视频流。它的数据采用32位BGRX格式打包。我想将这些数据直接移到Texture2d中,但我找不到匹配的SurfaceFormat。我能找到的最接近的是SurfaceFormat.Color,它看起来像是32位RGBX。
假设没有兼容的格式。将数据转换并推送到纹理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 :(得分: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);
}
如果没有涉及kinect,我的帧率为4200
将字节直接移动到texture2d而不更正格式差异yield:3100
如果你给自己一个带有e.ImageFrame.Image.Bits的局部变量,并将字节复制到一个预先分配的缓冲区,固定字节,我得到:2700
我在原始问题中列出的算法,您将位置交换到位,然后发送到texture2d,产量大约为750
因此,回顾一下这个算法,将帧速率从750
提高到2700