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

D3D SDK至少有两个优点:

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

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

这些对于D3D 程序员应该并不陌生,具体可以参见Direct 3D SDK文档。

这篇文章主要想讲一个在D3D编程中经常遇到的一个问题,从GPU中把数据取出,存入本地磁盘中。这个功能的应用也应该比较常见,例如保存游戏录像视频等。实现GPU to CPU拷贝的D3D 方法还是比较多的,但对于视频转存来说,能达到实时转存效果才有真正的利用价值。

这里首先简要介绍一下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.

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

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

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

copy(Dest,Source);

pBackbuffer->UnLock();

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

那microsoft有没有提供更好的解决方案呢?哈哈,答案是肯定的,直接上代码:

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

g_pd3dDevice->CreateOffscreenPlainSurface(d3dpp.BackBufferWidth,

d3dpp.BackBufferHeight,d3dpp.BackBufferFormat,D3DPOOL_SYSMEM,&g_p2DSurface,NULL);

g_pd3dDevice->GetRenderTargetData(pBackbuffer, g_p2DSurface);

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

copy(Dest,Source);

g_p2DSurface->UnLock();

这段代码的处理速度是很赞的,对于正在急于寻找处理方法而又看到我这篇文章的朋友将是很幸运的。
至于其深层的原因,关键还是取决去CreateOffscreenPlainSurface函数,这个函数在内存中开辟了一块区域g_p2DSurface,microsoft可能采取了某种策略使得这块内存区域是最利于GPU拷贝的。真正的本质原因由于没有看过源代码,也不是很清楚。

利用D3D抓取GPU数据相关推荐

  1. matlab抓取网页信息,如何利用Matlab抓取网页数据

    如何利用Matlab抓取网页数据 2019-01-01 %朋友需要做金融方面的分析,要求从网站上下载大量的数据,一个一个复制粘贴太费事.我写了一个简单的网络爬虫,主要用到正则表达式,可以自动下载网页源 ...

  2. PHP利用正则表达式抓取页面数据

    PHP利用正则表达式抓取页面数据 (记录一下,00后程序员第一天写博客,2021/4/1) (抓取招头标网站中的数据) <?php header('Content-Type:text/html; ...

  3. 利用Fiddler抓取APP数据

    利用Fiddler抓取APP数据 简杨君 关注 2016.11.03 18:51* 字数 368 阅读 762评论 0喜欢 2 软件:Fiddler 系统:Windows10 手机:MX4 PRO F ...

  4. 利用D3D抓取显存数据

    如何抓取显存的数据呢?在linux下直接通过FB就好,但是在windows下面不是那么好搞的? 这里看到了一些方法,还没有经过验证. microsoft 提供的D3D SDK是用来进行3D建模和利用G ...

  5. 抓取html 中文乱码,利用代码抓取网页数据,出现中文乱码问题

    嗯,多谢你解答.试验了,出现了另外一种乱码,自己又再次琢磨了http://club.excelhome.net/thread-893760-1-1.html这个帖子的第一帖,问题解决了,原因是'因为X ...

  6. 利用Java抓取网页数据

    // // MJViewController.m#import "MJViewController.h"@interface MJViewController ()@end@imp ...

  7. 如何利用Fiddler抓取websocket数据包?

    Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出"Fiddler的数据(指cookie,html,j ...

  8. python抓取数据包_利用python-pypcap抓取带VLAN标签的数据包方法

    1.背景介绍 在采用通常的socket抓包方式下,操作系统会自动将收到包的VLAN信息剥离,导致上层应用收到的包不会含有VLAN标签信息.而libpcap虽然是基于socket实现抓包,但在收到数据包 ...

  9. pythonallowpos_利用Python抓取并分析京东商品评论数据

    2.1 内容简介 本章主要介绍如何利用Python抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色等颜色, 70B到90D ...

最新文章

  1. Linux -- free 命令 内存适用状态监控
  2. .NET 2.0 CER学习笔记
  3. sqlserver、oracle数据库排序空值null问题解决办法
  4. 一二三系列之状压DP——Max Correct Set(一)Neko Rules the Catniverse (Large Version)(二)Make It Ascending(三)
  5. 制作MACOSX10.10.3/10.9安装启动盘U盘的教程
  6. mysql insert id的参数_Mysql----MySQL的mysql_insert_id和LAST_INSERT_ID(转)
  7. html5游戏面试题,关于HTML5的十大面试题
  8. (转)SQL Server 监控统计阻塞脚本信息
  9. 中科院分区基础版和升级版究竟有何区别?
  10. 台式计算机驱动程序未被安装,Win10提示该设备的驱动程序未被安装。(代码28)
  11. 通过网页获取图片操作步骤
  12. 八叉网的神奇明链外链技术
  13. 中科院计算机学院考研真题,2021年862计算机学科中国科学院大学考研真题及详解...
  14. **蒙特卡洛计算定积分VC++**
  15. 怎么用u盘重装系统?石大师u盘重装win10系统步骤
  16. Python写网络爬虫(三)
  17. android recyclerView Binary XML file line #7: Error inflating class android.support.v7.widget.Recycl
  18. 古人对梦的解释_中国古代对梦的解释-精选文档
  19. 信息技术 安全技术 信息安全管理体系 要求
  20. 1.3T计算机学科视频教程

热门文章

  1. GetlastError()函数返回值
  2. 图像的一维熵和二维熵
  3. Linux基础命令的使用
  4. 【刷算法】LeetCode- 阶乘后的零
  5. 阿里技术专家玄惭回忆:我是如何自学技术拿到阿里offer
  6. OpenGL 获取当前屏幕坐标对应的三维坐标
  7. 2017CCPC秦皇岛 L题One-Dimensional MazeZOJ3992【模拟】
  8. 【JavaScript】离开页面前提示
  9. python 学习之 WINDOWS 注册表学习(一)
  10. python2.x和python3.x共存在windows