从磁盘加载图像并将其绘制到Direct2D资源

时间:2013-11-29 10:13:24

标签: directx direct2d

我正在使用DirectX11 Direct2D编写应用程序,其中一部分是实时加载和绘制图像文件序列(视频叠加)。这些图像文件的大小各不相同(100x100~2000x2000 x RGBA)。将有optiziations,preloading(prebuffering)逻辑,但我想了解这是什么样的正确/最佳实践/方法。

这是当前的工作流程,我遵循:

  1. 使用WIC加载文件,
  2. 转换为PBGRA位图(可选),
  3. 锁定WIC像素,
  4. 使用此像素数据创建D2D1Bitmap
  5. 然而,问题是这很慢。它在第4点出现瓶颈 - 将像素数据传输到VRAM。所以我期待更快的方式(即 - 最快的方式)。

    那么,有没有办法以纹理或其他方式直接将图像加载为DirectX资源,这样我可以最大限度地缩短整个过程/迭代的时间?并最终避免使用WIC组件?

    提前致谢 最诚挚的问候

1 个答案:

答案 0 :(得分:0)

经过一些研究和实验后,我得到了以下解决方案:

一般方法

我通过跟踪帧之间的差异来最小化传输的数据大小,因此在新帧中我只为该区域创建位图,该区域与前一帧不同。然后将这个较小的位图绘制到它在前一帧位图上的相关位置。当然,这种跟踪无法实时完成,但幸运的是,在我的情况下,我能够提前评估不同的位图区域。

我做的另一件事是用B8R8G8A8_UNORM(即32bppPBGRA WIC格式)准备我的位图数据,这样我就可以避免在运行时转换为这种像素格式。

Windows 8.1

我没有对此进行测试,但似乎Windows 8.1 Direct2D为ID2D1Bitmap(msdn)提供了块压缩支持。这意味着可以用DDS格式准备大位图,并将那些直接压缩到视频RAM,这将远远少于与未压缩位图相关的数据量。