我正在尝试制作一个简单的视频播放器,例如带有Direct2D和WIC位图的程序。
它需要YUV像素格式帧数据的快速和CPU经济绘制(带有拉伸(stretch))。
我已经使用GDI进行了测试。我希望切换到Direct2D至少可以使性能提高10倍(较小的CPU开销)。
我要做的基本上是这样的:
对于1、2步骤,我必须选择一种像素格式。
WIC Native Pixel Formats
有一个MSDN页面推荐
WICPixelFormat32bppPBGRA
。http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393(v=vs.85).aspx
WICPixelFormat32bppPBGRA
和WICPixelFormat32bppBGRA
有什么区别? (前者有附加的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 target或DeviceContext与交换链配合使用(取决于您使用的Direct2D版本)。
您可以使用WIC的软件像素格式转换功能(例如IWICFormatConverter)来代替将 B 框架呈现为 A 框架。另一种方法是使用SIMD操作编写(或查找)自定义转换例程。或使用着色器在GPU端转换格式(色彩空间)。但是后两个需要高级知识。
转换后,您可以锁定像素以获取像素数据,并将该数据直接复制到D2D位图(ID2D1Bitmap::CopyFromMemory())。假设您已经有一个就绪的d2d位图。
最后一步是将位图渲染到渲染目标。您可以使用变换矩阵来实现拉伸(stretch)。
关于windows - WIC位图处理最有效的像素格式是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26139710/