【发布时间】:2018-04-02 23:16:23
【问题描述】:
我正在将相机中的帧上传到 GPU 上的纹理进行处理(使用 SharpDX)。我的问题是 ATM 是我的帧以 24 位 RGB 的形式输入,但 DX11 不再具有 24 位 RGB 纹理格式,只有 32 位 RGBA。在每 3 个字节之后,我需要添加另一个值为 255 的字节(不透明)。我已经尝试过这种遍历字节数组的方法来添加它,但它太贵了。使用 GDI 位图进行转换也很昂贵。
int count = 0;
for (int i = 0; i < frameDataBGRA.Length - 3; i+=4)
{
frameDataBGRA[i] = frameData[i - count];
frameDataBGRA[i + 1] = frameData[(i + 1) - count];
frameDataBGRA[i + 2] = frameData[(i + 2) - count];
frameDataBGRA[i + 3] = 255;
count++;
}
【问题讨论】:
-
无论哪种方式都会很昂贵,但我要做的是将其分成 3 或 4 块并在并行线程中处理。
-
对每个像素进行迭代并为每个像素保留单独的索引会更清楚,将 ARGB 递增 4 并将 RGB 递增 3。此外,不确定“帧”是什么意思,但除非这意味着“扫描线”你忽略了你的步幅四舍五入。
-
@Nyerguds 哪个需要更长的时间?
-
并非如此。每个循环将是两个加法,而不是您现在使用“计数”进行的三个减法。无论如何都需要考虑步幅。
-
基于 Ron 的评论,但我会稍微改变一下。你可以做多线程,每张图片做 1 个线程。如果您有一个 8 线程 CPU,那么该转换将并行完成。另一件事是,如果你真的需要那种像素格式,你仍然可以利用旧的 DX9 库。