加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 执行时间:GetFrontBufferData,GetBackBuffer,GetRenderTar

发布时间:2020-12-16 07:08:33 所属栏目:百科 来源:网络整理
导读:我正在尝试使用DirectX捕获屏幕的几种方法,到目前为止我已经提出了3种方法: GetFrontBufferData() – 平均执行时间: GetFrontBufferData():0.83598 s D3DXSaveSurfaceToFile():0.0036 s 总计:0.83958 s GetBackBuffer() – 平均执行时间: GetBackBuffe
我正在尝试使用DirectX捕获屏幕的几种方法,到目前为止我已经提出了3种方法:

> GetFrontBufferData() – 平均执行时间:

> GetFrontBufferData():0.83598 s
> D3DXSaveSurfaceToFile():0.0036 s
>总计:0.83958 s

> GetBackBuffer() – 平均执行时间:

> GetBackBuffer():0 s< - 有趣 - 为什么?
> D3DXSaveSurfaceToFile():0.2918 s
>总计:0.2918秒

> GetRenderTargetData() – 平均执行时间:

> GetRenderTargetData():0.00928 s
> D3DXSaveSurfaceToFile():0.00354 s
>总计:0.01282秒

通过拍摄50个屏幕截图并通过clock()测量时间来计算平均时间.

但是,正如您所看到的,上述所有方法都可以工作,对于相同的结果(显然),执行时间因方法而异.

所以我有几个问题:

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

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

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

谢谢.

编辑:我还在寻找答案.

解决方法

您所指的过程称为“回读”,它涉及从GPU视频RAM复制数据.除了一些特定的统一内存架构(例如Xbox 360)之外,回读是一个缓慢的过程.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读