利用D3D抓取显存数据

https://blog.csdn.net/u011046042/article/details/54427775

microsoft 提供的D3D SDK是用来进行3D建模和利用GPU运算的一组接口的集合,

D3D SDK至少有两个优点:

1、提供了一种3D建模的构架,程序员可以很容易的用这种构架来建模自己的3D模型

2、提供了一种GPU和CPU并行运算的解决方案,,为提供应用程序的性能提供了一种思路

D3D 渲染的基本流程:

----------------------------------------------------------------

1. D3D setting states//设置渲染环境
 
2. g_pd3dDevice->beginscene();
 
3. D3D 管线渲染
 
4. g_pd3dDevice->EndScene();

----------------------------------------------------------------

至此,D3D的渲染过程已经结束,渲染处理的最终数据被存于D3D surface(这是在GPU中开辟的存储区域), 下面可以根据具体的需求来对该surface进行后处理:

1 直接显示:g_pd3dDevice->present();

2 转存到本地磁盘,即GPU to CPU的copy.

这里给出比较常见的一种处理方法:

 
  1. g_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackbuffer);

  2.  
  3. pBackbuffer->LockRect(&Source,NULL,0);

  4.  
  5. copy(Dest,Source);

  6.  
  7. pBackbuffer->UnLock();

这种方法缺点很严重,就是由于IPtrD3dsurface lock的内存是位于显卡中,这样在做copy(Dest,Source)的时候,非常缓慢,基本无法实现实时转存的要求。

 

这个方法本人试过了差不多一张1080P的需要使用50ms以上,这个速度超级慢

那microsoft有没有提供更好的解决方案呢?

这个微软利用了另外的方式做的

代码如下:

-----------------------------------------------------------------------------------------

  1. g_pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackbuffer);

  2. g_pd3dDevice->CreateOffscreenPlainSurface(d3dpp.BackBufferWidth,d3dpp.BackBufferHeight,d3dpp.BackBufferFormat,D3DPOOL_SYSMEM,&g_p2DSurface,NULL);

  3. g_pd3dDevice->GetRenderTargetData(pBackbuffer, g_p2DSurface);

  4. g_p2DSurface->LockRect(&Source,NULL,0);

  5. copy(Dest,Source);

  6. g_p2DSurface->UnLock();

-----------------------------------------------------------------------------------------

GamingAnyWhere用的就是上面的方式。

你可能感兴趣的:(Windows)