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

Directx 从磁盘加载图像并将其绘制到Direct2D资源,directx,direct2d,Directx,Direct2d,我正在使用DirectX11 Direct2D编写一个应用程序,其中一部分是实时加载和绘制图像文件序列(视频叠加)。这些图像文件的大小各不相同(100x100~2000x2000 x RGBA)。将会有一些选项、预加载(预缓冲)逻辑,但我想了解做这件事的正确/最佳实践/方法是什么 以下是当前的工作流程,我遵循: 用WIC加载文件 转换为PBGRA位图(可选) 锁定WIC像素 使用此像素数据创建D2D1位图 然而,问题是这是缓慢的。它在第4点(将像素数据传输到VRAM)处遇到瓶颈。所以我在寻找一种

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

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

  • 用WIC加载文件
  • 转换为PBGRA位图(可选)
  • 锁定WIC像素
  • 使用此像素数据创建D2D1位图
  • 然而,问题是这是缓慢的。它在第4点(将像素数据传输到VRAM)处遇到瓶颈。所以我在寻找一种更快的方法

    那么,有没有一种方法可以以纹理的形式加载图像,或者以其他方式直接作为DirectX资源加载图像,这样我就可以最小化整个过程/迭代的时间?最终避免使用WIC组件

    提前谢谢
    最好的问候

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

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

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

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

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