【问题标题】:Does XNA have a BGRA/BGRX surface format?XNA 是否有 BGRA/BGRX 表面格式?
【发布时间】:2011-09-14 09:55:56
【问题描述】:

我有一个来自 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);
    }

【问题讨论】:

    标签: c# xna-4.0 kinect


    【解决方案1】:

    这是我能想到的最快的方法:

        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

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 2021-03-12
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多