【发布时间】:2013-11-29 10:13:23
【问题描述】:
我正在使用 DirectX11 Direct2D 编写应用程序,其中一部分是实时加载和绘制图像文件序列(视频叠加)。这些图像文件的大小各不相同(100x100 ~ 2000x2000 x RGBA)。将会有优化、预加载(预缓冲)逻辑,但我想了解这样做的正确/最佳实践/方法是什么。
这是当前的工作流程,我遵循:
- 使用 WIC 加载文件,
- 转换为 PBGRA 位图(可选),
- 锁定 WIC 像素,
- 使用此像素数据创建 D2D1Bitmap
但是,问题是这很慢。它在第 4 点出现瓶颈 - 将像素数据传输到 VRAM。所以我正在寻找一种更快的方法(即 - 什么是最快的)。
那么,有没有办法以纹理或其他方式直接作为 DirectX 资源加载图像,这样我就可以最大限度地减少整个过程/迭代的时间?并最终避免使用 WIC 组件?
提前致谢 最好的问候
【问题讨论】:
-
在第4步中,你使用
CreateBitmapFromWicBitmap(MSDN here)吗?如果没有,您应该尝试一下,如果是,那么我看不出您为什么需要第 3 步。 -
对不起,我忘了提 - 我使用 ID2D1DeviceContext::CreateBitmap() (msdn)。我还尝试了 ID2D1DeviceContext::CreateBitmapFromWicBitmap 方法,它们在性能上看起来很相似。是的,那时我不需要锁定 WIC 像素数据。无论如何,就我而言(使用这两种方法),将高清位图(1920×1080)加载到 D2D1Bitmap 最多需要 30 毫秒。这对我的需求来说太慢了。
-
所以假设 RGBA,你正在实现的大约是每秒 260 兆字节。你的硬件能做什么?
-
我正在使用测试配置。我尝试将文件移动到 RAM 驱动器。这会导致速度下降 20%。但我的问题更多是关于解决问题的一般方法。
-
如果迁移到 RAM 驱动器可以提高性能,那么您的瓶颈可能是跨任何总线将图像从磁盘获取到图形内存所需的内存传输。您的一般方法对我来说似乎很好,并且是我在许多应用程序中使用的一种方法,尽管不适用于高清图像。