执行时间:GetFrontBufferData、GetBackBuffer、GetRenderTargetData
Execution time: GetFrontBufferData, GetBackBuffer, GetRenderTargetData
我正在尝试几种使用DirectX捕捉屏幕的方法,到目前为止我已经想出了3种方法:
GetFrontBufferData()
-平均执行时间:GetFrontBufferData()
:0.83598sD3DXSaveSurfaceToFile()
:0.0036 s- 总计:0.83958 s
GetBackBuffer()
-平均执行时间:GetBackBuffer()
:0 s<--有趣——为什么D3DXSaveSurfaceToFile()
:0.2918秒- 总计:0.2918 s
GetRenderTargetData()
-平均执行时间:GetRenderTargetData()
:0.00928秒D3DXSaveSurfaceToFile()
:0.0054s- 总计:0.01282 s
通过拍摄50张屏幕截图和用clock()
测量时间来计算平均时间。
然而,正如您所看到的,上面所有的方法都有效,对于相同的结果,不同方法的执行时间差异很大。
所以我有几个问题:
- 为什么不同方法的执行时间差异如此之大
- 为什么
GetBackBuffer()
很快,而D3DXSaveSurfaceToFile()
很慢
我对我的第一个问题有一个假设,如果我错了,请纠正我:
GetFrontBufferData()
非常慢,因为前缓冲区在VRAM中,并且它被锁定/保护,因为这是当前显示在屏幕上的内容GetBackBuffer()
(和D3DXSaveSurfaceToFile()
)更快,因为后缓冲区在VRAM中,但它当前没有显示在屏幕上,因此更容易检索- 最后,
GetRenderTargetData()
很快,因为渲染目标在系统ram中(而不是在VRAM中),所以我们可以很快地检索它
谢谢。
编辑:我还在寻找答案。
您所指的过程称为"读回",它涉及将数据从GPU视频RAM中复制回来。除了一些特定的统一内存架构(如Xbox 360)外,读回是一个缓慢的过程。
根据您的操作系统和其他设置,前缓冲区和后缓冲区可能都只是VRAM中的"屏幕外"纹理。当您停止渲染以捕捉屏幕快照时,还涉及各种锁和GPU管道暂停。
你可能会发现这篇(现在相当旧的)文章很有用。
请注意,Direct3D 10/11提供了许多功能,主要通过允许算法将数据保留在GPU上来克服GPU"读回"的固有缓慢性。