我尝试使用DirectX捕获屏幕的几种方法,到目前为止我已经提出了3种方法:
GetFrontBufferData()
- 平均执行时间:
GetFrontBufferData()
: 0.83598 s D3DXSaveSurfaceToFile()
: 0.0036 s GetBackBuffer()
- 平均执行时间:
GetBackBuffer()
: 0 s < - 有趣 - 为什么? D3DXSaveSurfaceToFile()
: 0.2918 s GetRenderTargetData()
- 平均执行时间:
GetRenderTargetData()
: 0.00928 s D3DXSaveSurfaceToFile()
: 0.00354 s 通过拍摄50张截图并使用clock()
测量时间来计算平均时间。
然而,正如您所看到的,上述所有方法都起作用,对于相同的结果(显然),执行时间从一种方法到另一种方法的变化很大。
所以我有几个问题:
GetBackBuffer()
非常快,但D3DXSaveSurfaceToFile()
非常慢?我对我的第一个问题有一个假设,如果我错了,请纠正我:
GetFrontBufferData()
非常慢,因为前置缓冲区位于VRAM中并被锁定/保护,因为它是当前显示在屏幕上的内容。GetBackBuffer()
(和D3DXSaveSurfaceToFile()
)速度更快,因为后台缓冲区位于VRAM中,但当前未显示在屏幕上,因此检索起来更容易。< / LI>
GetRenderTargetData()
很快,因为渲染目标位于系统ram中(不在VRAM中),因此我们可以非常快速地检索它。谢谢。
编辑:我还在寻找答案。答案 0 :(得分:1)
您所指的流程称为&#39;回读&#39;这涉及从GPU视频RAM中复制数据。除了一些特定的统一内存架构(例如Xbox 360)之外,回读是一个缓慢的过程。
根据您的操作系统和其他设置,前端缓冲区和后端缓冲区可能都只是在屏幕外显示。 VRAM中的纹理。当您停止渲染以捕获屏幕截图时,还会涉及各种锁和GPU管道停滞。
你可能会发现这个(现在很旧)article很有用。
请注意,Direct3D 10/11提供了许多功能来克服“回读”固有的缓慢性。从GPU主要通过允许算法将数据保存在GPU上。