惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
Project Zero
Project Zero
K
Kaspersky official blog
G
Google Developers Blog
T
Threat Research - Cisco Blogs
T
The Blog of Author Tim Ferriss
Cyberwarzone
Cyberwarzone
Y
Y Combinator Blog
Recorded Future
Recorded Future
Blog — PlanetScale
Blog — PlanetScale
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cisco Talos Blog
Cisco Talos Blog
Latest news
Latest news
Microsoft Security Blog
Microsoft Security Blog
H
Help Net Security
S
Schneier on Security
P
Palo Alto Networks Blog
H
Hacker News: Front Page
N
News and Events Feed by Topic
N
Netflix TechBlog - Medium
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
SecWiki News
SecWiki News
Cloudbric
Cloudbric
TaoSecurity Blog
TaoSecurity Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The Hacker News
The Hacker News
C
Check Point Blog
L
LangChain Blog
腾讯CDC
小众软件
小众软件
T
Tenable Blog
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
L
LINUX DO - 最新话题
A
About on SuperTechFans
Google Online Security Blog
Google Online Security Blog
C
Cisco Blogs
Recent Announcements
Recent Announcements
Hacker News: Ask HN
Hacker News: Ask HN
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Vercel News
Vercel News
雷峰网
雷峰网
美团技术团队
D
DataBreaches.Net
Martin Fowler
Martin Fowler
Help Net Security
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
F
Full Disclosure
博客园_首页

博客园 - 游民一族

VR发展的最大障碍在于内容? 无法修改Form尺寸的解决方法 [ATL/ActiveX]全屏显示ActiveX控件 近期业余生活以及计划(持续更新) [C#]mouse_event模拟点击时坐标参数无效?! Javascript: IE中命名函数直接量的Bug? - 游民一族 - 博客园 ASP.NET AJAX Client Library: 更繁?更简? ASP.NET动态创建控件之绝境求生 喜讯,公司换宽屏液晶显示器了 分享:基于UDP协议实现可靠的数据传输 C#线程:只要任何一个线程在运行,程序就不退出?! 基于Web的仿WF工作流设计器 [ASP.NET]ASP.NET 2.0中Membership的UserID问题 [ASP.NET AJAX]谨记给UpdatePanel中动态添加的控件赋ID VS 2005 BUG: 新增JScript文件编码问题引起乱码? [ASP.NET]如何灵活定制皮肤/页面:布局设计器介绍 过滤ASP.NET输出HTML中的无用空格 在JavaScript中实现命名空间 [C#]NHibernate处理多帐套问题
远程控制之屏幕截取 小结
游民一族 · 2007-07-05 · via 博客园 - 游民一族

为了实现高速屏幕传输,势必不能每次都截取整个屏幕,这样做的后果就是待传输的过大数据量和有限带宽(假设约20K~50K)之间的矛盾。为了让显示更加流畅,必须在单位时间内利用有限的带宽传输近可能多帧的图象过来,这里就需要实现差异截屏

实现差异截屏有以下三种方案可以选择:

  1. (BitBlt或DirectDraw) + (隔行取样或CRC或Hash)
  2. Hook: 参考VNC实现
  3. 虚拟显卡:参考陈经韬的例子,无源码(Delphi)

注:目前网上能找到源码的一般都是使用第一种方案。

使用差异截屏有可能需要进行屏幕分块,就是将整个屏幕分成N个小区域,每次仅仅传输通过某种算法判断已经变化的部分,区域的大小一般都是根据经验设定!

为了进一步减少待传输的数据量,还可以选择性地进行压缩,压缩方式也有两种选择:

  1. BMP -> JPEG:有损压缩,压缩比相对较高
  2. 通用压缩:Zip、ZLib(Ex)等

通过以上的步骤,一般就可以实现在广域网上实现相对比较流畅的屏幕传输了,当然,采用虚拟显卡方式好像速度最快,Hook方式次之,不过实现难度也是从高到低的!

目前该应用的瓶颈主要是带宽的限制,为此需要尽量减小差异截屏后获得的数据量,但是测试的结果也只能达到每秒数帧的效果,和网上某些文章提到的动辄几十帧上百帧(注:个人感觉有水分^_^)的效果相差甚远!

2007/07/06 Update:

使用虚拟显卡驱动本质上是编写一个Display Mirror Driver,安装之后该驱动和物理显卡驱动将会收到完全相同的事件,根据这些事件可以判断屏幕的那些区域发生改变,而且在驱动中可以直接操作显存,就不需要耗费大量的CPU进行bltting!

据说PcAnyWhere、远程桌面(WIN2000之后)以及部分远程控制软件均采用该技术实现。

DirectDraw好像也是可以直接操作现存的,不知道和用Mirror Driver这种方法比效率相差有多大!?

参考:http://www.osronline.com/showthread.cfm?link=111960

2007/07/11 Update:

在用GDI Bitblt函数或DirectDraw进行高速截屏时,为了得知那些区域发生变化,必须保存一份屏幕拷贝,通过将最新的屏幕镜像和保存的拷贝进行比较,从而获得发生变化的区域!用Bitblt获得屏幕拷贝速度非常慢,为了获得1280*720大小的截屏,在我机器上需要350ms左右,用DirectDraw在这一点上就好多了。

VNC采用Hook的方法截获所有相关的Windows消息,然后判断各个消息对哪些屏幕矩形区域有影响,把这些矩形区域合成一个Region,在更新的时候进行更新这些区域。

采用虚拟驱动的原理和Hook方法类似,不过截获的不是Windows消息,而是直接在驱动中截获GDI函数调用,在这些函数中获得变化的矩形区域并组合成最终的Region,由于驱动和普通应用程序处于不同的特权级别,因此在读显存之后需要将数据传到ring3,处理起来相当麻烦,而且处理不善将有很大的效率问题!