【问题标题】:Loading images from disk and drawing them to Direct2D resource从磁盘加载图像并将它们绘制到 Direct2D 资源
【发布时间】:2013-11-29 10:13:23
【问题描述】:

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

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

  1. 使用 WIC 加载文件,
  2. 转换为 PBGRA 位图(可选),
  3. 锁定 WIC 像素,
  4. 使用此像素数据创建 D2D1Bitmap

但是,问题是这很慢。它在第 4 点出现瓶颈 - 将像素数据传输到 VRAM。所以我正在寻找一种更快的方法(即 - 什么是最快的)。

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

提前致谢 最好的问候

【问题讨论】:

  • 在第4步中,你使用CreateBitmapFromWicBitmapMSDN here)吗?如果没有,您应该尝试一下,如果是,那么我看不出您为什么需要第 3 步。
  • 对不起,我忘了提 - 我使用 ID2D1DeviceContext::CreateBitmap() (msdn)。我还尝试了 ID2D1DeviceContext::CreateBitmapFromWicBitmap 方法,它们在性能上看起来很相似。是的,那时我不需要锁定 WIC 像素数据。无论如何,就我而言(使用这两种方法),将高清位图(1920×1080)加载到 D2D1Bitmap 最多需要 30 毫秒。这对我的需求来说太慢了。
  • 所以假设 RGBA,你正在实现的大约是每秒 260 兆字节。你的硬件能做什么?
  • 我正在使用测试配置。我尝试将文件移动到 RAM 驱动器。这会导致速度下降 20%。但我的问题更多是关于解决问题的一般方法。
  • 如果迁移到 RAM 驱动器可以提高性能,那么您的瓶颈可能是跨任何总线将图像从磁盘获取到图形内存所需的内存传输。您的一般方法对我来说似乎很好,并且是我在许多应用程序中使用的一种方法,尽管不适用于高清图像。

标签: directx direct2d


【解决方案1】:

经过一些研究和实验,我提出了以下解决方案:

一般方法

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

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

Windows 8.1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2018-10-23
    相关资源
    最近更新 更多