您的位置:首页 > 编程语言

使用编程语言进行截图的研究报告

2015-11-07 17:27 267 查看
背景:

在我的工作中,有一个工作是需要将指定的窗口进行截屏,然后传送截屏数据。可以理解为TeamViewer的工作,不过不同点在于我们要截图的区域就是我们自己的播放软件,播放的内容有视频文字等等,而且播放区域不一定是一个窗口,可能是多个Form的组合,于是我们为了截取这个复合窗口,我们一直在考虑的是使用截屏的方式,取得整屏图像,然后截取我们的复合窗口部分即可。

比如我们的播放区域如下图:



目前遇到两个问题:

1.使用的截屏方法不够高效,速度慢

2.截屏会导致,我们窗口中可能播放的滚动的文字抖动,其本质在于我们的文字滚动原理是使用GDI每40ms绘制一次,这样才能让人眼感觉到连续的滚动(1000ms/24frame),这样对cpu的使用是很频繁的,而在截屏的那一刻势必牵扯到一次显卡数据拷贝的过程,这次拷贝比较大,于是我们文字的滚动收到影响,会顿一下。由于我们需要连续的截屏,然后将截屏数据传送出去在别的终端显示。于是文字就在不断地抖动了。。。

为了解决上述问题,才有了下面的完整报告:

第一阶段:

1.发现的问题:

目前使用的截图技术:采用Bitblt直接拷贝Display的数据,1)导致使用Direct3D进行走马灯绘制会抖动 2)效率不高

2.解决方向:

寻找替代的截图方案,解决上述两个问题

3.研究过程:

1)使用Direct3D截图,核心代码:

mv_pd3dDevice->GetFrontBufferData(0, mv_pSurface);

未能解决问题:既影响播放也效率不高,截取桌面耗时50~60ms

2)使用镜像驱动(Mirror Driver)截图,

未能解决问题:影响走字

3)使用自制的显卡驱动获取显卡地址截图,

未能解决问题:效率不行,截取100行数据花费了80ms,CPU占用率80%,影响走字

第二阶段:

1.解决方向:

从C++上入手寻找根据窗口DC截屏的方法

2.研究过程

1)开始的研究

(1).发现使用Bitblt对单窗口进行位块拷贝,速度快不影响走字,

(2).在播放软件主工程中,对所有所有播放的窗口截图,使用bitt或者transparentblt将所有拷贝的区域叠加在一起,组成最终截图

(3).使用共享内存,将截图实时存放进去,然后由服务循环取图并发送到接收卡显示

(4).通过上述步骤实现的播放抖动严重播放不稳定,接下来对将图像稳定的显示出来进行了研究
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: