2

我正在尝试使用 Direct2D 和 WIC 位图制作一个简单的视频播放器,例如程序。
它需要对 YUV 像素格式帧数据进行快速且 CPU 经济的绘图(带拉伸)。

我已经用 GDI 进行了测试。我希望切换到 Direct2D 可以带来至少 10 倍的性能提升(更小的 CPU 开销)。

我要做的基本上如下:

  1. 创建一个空的 WIC 位图 A(用于绘图画布)
  2. 用 YUV 帧数据创建另一个 WIC 位图 B(格式转换)
  3. 将位图 B 绘制到 A 上,然后将 A 绘制到 D2D 渲染目标

对于 1、2 步,我必须选择像素格式。
WIC 原生像素格式

有一个 MSDN 页面推荐WICPixelFormat32bppPBGRA
http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393(v=vs.85).aspx

WICPixelFormat32bppPBGRA和有什么区别WICPixelFormat32bppBGRA?(前者有附加P)

如果WICPixelFormat32bppPBGRA是要走的路,总是这样吗?无论硬件和/或配置?

实际上,WIC 位图处理最有效的像素格式是什么?

4

1 回答 1

5

不幸的是,使用 Direct2D 1.1 或更低版本,您不能使用与 DXGI_FORMAT_B8G8R8A8_UNORM不同的像素格式,它等效于 WIC 的WICPixelFormat32bppPBGRA(如果您在 D2D 中使用D2D1_ALPHA_MODE_PREMULTIPLIED alpha 模式,则为“P”)。

如果您的目标操作系统是 Windows 8,那么您可以使用 Direct2D 的新功能。据我记得有某种对 D2D 位图的 YUV 支持。(编辑:不,没有。RGB32 仍然是唯一支持的像素格式以及一些仅 alpha 格式)

实际上,WIC 位图处理最有效的像素格式是什么?

我不确定如何测量像素格式的有效性,但如果你想使用硬件加速,你应该使用 D2D 而不是 WIC 进行绘制,并且只使用 WIC 进行色彩空间转换。(顺便说一句,GDI 也是硬件加速的)。

WICPixelFormat32bppPBGRA 和 WICPixelFormat32bppBGRA 有什么区别?(前者有附加P)

P 表示 RGB 分量是预乘的。(见这里

我要做的基本上如下:

  1. 创建一个空的 WIC 位图 A(用于绘图画布)
  2. 用 YUV 帧数据创建另一个 WIC 位图 B(格式转换)
  3. 将位图 B 绘制到 A 上,然后将 A 绘制到 D2D 渲染目标

如果以性能为目标,则应尽量减少位图复制操作,同时应避免使用 WIC 位图渲染目标,因为它使用软件渲染。如果您的播放器只渲染到一个窗口,您可以使用HWND 渲染目标,或带有交换链的DeviceContext(取决于您使用的 Direct2D 版本)。

除了将帧B渲染到帧A之外,您还可以使用 WIC 的软件像素格式转换功能(例如IWICFormatConverter)。另一种方法是使用 SIMD 操作编写(或查找)自定义转换例程。或者使用着色器在GPU 端转换格式(色彩空间)。但后两者需要高级知识。

转换后,您可以锁定像素以获取像素数据并将该数据直接复制到 D2D 位图(ID2D1Bitmap::CopyFromMemory())。假设您已经有一个准备好的 d2d 位图。

最后一步是将位图渲染到渲染目标。并且可以使用变换矩阵来实现拉伸。

于 2014-10-01T11:37:56.180 回答