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

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

我要做的基本上是这样的:

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

  • 对于1、2步骤,我必须选择一种像素格式。
    WIC Native Pixel Formats

    有一个MSDN页面推荐WICPixelFormat32bppPBGRA
    http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393(v=vs.85).aspx
    WICPixelFormat32bppPBGRAWICPixelFormat32bppBGRA有什么区别? (前者有附加的P)

    如果要使用WICPixelFormat32bppPBGRA,是否总是这样?不论硬件和/或配置?

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

    最佳答案

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

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



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



    P表示RGB分量被预乘。 (see here)



    如果您以性能为目标,则应尽量减少位图复制操作,还应避免使用WIC位图渲染目标,因为它使用软件渲染。如果您的播放器仅渲染到窗口,则可以将HWND render targetDeviceContext与交换链配合使用(取决于您使用的Direct2D版本)。

    您可以使用WIC的软件像素格式转换功能(例如IWICFormatConverter)来代替将 B 框架呈现为 A 框架。另一种方法是使用SIMD操作编写(或查找)自定义转换例程。或使用着色器在GPU端转换格式(色彩空间)。但是后两个需要高级知识。

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

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

    关于windows - WIC位图处理最有效的像素格式是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26139710/

    10-10 20:32