执行时间:GetFrontBufferData,GetBackBuffer,GetRenderTargetData

时间:2014-04-16 19:40:13

标签: c++ windows winapi directx-9

我尝试使用DirectX捕获屏幕的几种方法,到目前为止我已经提出了3种方法:

  • GetFrontBufferData() - 平均执行时间:
    • GetFrontBufferData() 0.83598 s
    • D3DXSaveSurfaceToFile() 0.0036 s
    • 总计: 0.83958 s
  • GetBackBuffer() - 平均执行时间:
    • GetBackBuffer() 0 s < - 有趣 - 为什么?
    • D3DXSaveSurfaceToFile() 0.2918 s
    • 总计: 0.2918 s
  • GetRenderTargetData() - 平均执行时间:
    • GetRenderTargetData() 0.00928 s
    • D3DXSaveSurfaceToFile() 0.00354 s
    • 总计: 0.01282 s

通过拍摄50张截图并使用clock()测量时间来计算平均时间。

然而,正如您所看到的,上述所有方法都起作用,对于相同的结果(显然),执行时间从一种方法到另一种方法的变化很大。

所以我有几个问题:

  • 为什么从一种方法到另一种方法的执行时间差别很大?
  • 为什么GetBackBuffer()非常快,但D3DXSaveSurfaceToFile()非常慢?

我对我的第一个问题有一个假设,如果我错了,请纠正我:

  • GetFrontBufferData()非常慢,因为前置缓冲区位于VRAM中并被锁定/保护,因为它是当前显示在屏幕上的内容。
  • GetBackBuffer()(和D3DXSaveSurfaceToFile())速度更快,因为后台缓冲区位于VRAM中,但当前未显示在屏幕上,因此检索起来更容易。< / LI>
  • 最后,GetRenderTargetData()很快,因为渲染目标位于系统ram中(不在VRAM中),因此我们可以非常快速地检索它。

谢谢。

编辑:我还在寻找答案。

1 个答案:

答案 0 :(得分:1)

您所指的流程称为&#39;回读&#39;这涉及从GPU视频RAM中复制数据。除了一些特定的统一内存架构(例如Xbox 360)之外,回读是一个缓慢的过程。

根据您的操作系统和其他设置,前端缓冲区和后端缓冲区可能都只是在屏幕外显示。 VRAM中的纹理。当您停止渲染以捕获屏幕截图时,还会涉及各种锁和GPU管道停滞。

你可能会发现这个(现在很旧)article很有用。

请注意,Direct3D 10/11提供了许多功能来克服“回读”固有的缓慢性。从GPU主要通过允许算法将数据保存在GPU上。