执行时间:GetFrontBufferData、GetBackBuffer、GetRenderTargetData

Execution time: GetFrontBufferData, GetBackBuffer, GetRenderTargetData

本文关键字:GetBackBuffer GetRenderTargetData GetFrontBufferData 执行时间      更新时间:2023-10-16

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

  • GetFrontBufferData()-平均执行时间:
    • GetFrontBufferData():0.83598s
    • D3DXSaveSurfaceToFile():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"读回"的固有缓慢性。