首页
社区
课程
招聘
[求助]关于VNC中用到的屏幕截图算法的疑问...
发表于: 2008-6-10 21:52 14044

[求助]关于VNC中用到的屏幕截图算法的疑问...

2008-6-10 21:52
14044
本想写一个远程屏幕传输,但卡在了差异截图上面。原先是通过划块比较,传输变化的区域来实现的,不过速度上根本无法满足要求 。主要问题是划成32x32小块后,需要对这些小分块与之前的逐一比较(块分得越大越慢),这个过程比较慢而且CPU占用相当高。
我目的是实现一个类似VNC的远程屏幕,求各位前辈指点迷津...

看了UltraVnc的源代码,发现它好像是通过HOOK消息循环实现的。/VNCHooks/VNCHooks.cpp里看出点眉目,活动窗体一旦发生重绘,就PostMessage()告诉VNCServer更新指定区域。不过看到vncDesktop.cpp我就有点头大了(主要是代码太多 ),不知道它是如何具体调用VNCHooks.dll的,望研究过VNC的前辈指点一二。能否将VNCHooks单独拿出来做屏幕截图之用?应该如何下手?

ps: Windows的3389也很强悍的,从具体使用上看应该是划块传输。问题是它如何做到比较屏幕分块而只占用3%左右CPU的?听说从Win2000后就有个镜像驱动,可以方便的实现屏幕传输,但是网上和MSDN中都搜不到,真是急死我了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 119
活跃值: (298)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
3389不是划块传输的! 03抓屏算法vnc的不算最好!看看gh0st吧! ring0你可以hook win32k.sys 或者hook irp!
2008-6-10 23:28
0
雪    币: 243
活跃值: (174)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
微软的3389使用的RDP协议(远程桌面协议,Remote Desktop Protocol)
它仅传输服务器所显示的对象的属性变化的控制值,实现快速远程控制,相对于其它采用抓屏图片压缩的远程控制软件,速度更快,控制更准确。
差异截图用的较多的是XOR,这样可以降低传输数据,你说的是分块差异传输
基于消息机制的是hook各种窗口变化消息,然后合并各个变化矩形,找出最小变化矩形,然后截取发送
目前比较好的算法是隔行扫描,包括固定块隔行扫描,和分块隔行扫描等,redmin,黑洞,gh0st等都用的这个算法
mirror驱动也是应用的比较多的一种,有兴趣的可以加QQ群63581069,大家讨论讨论
2008-6-11 09:27
0
雪    币: 232
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
刚下到gh0st源码,谢谢你的提醒,我再去研究研究 。ring0下就算了,涉及驱动、内核的东西我看着就头大。

RDP协议我在MSDN里看过了,它是用于处理数据传输部分的,我想知道的是截图原理。
听你这么一说我也想起来了,确实见过有XOR整个图象,然后压缩传输的算法。由于相同部分异或后内容为0,所以压缩比较高。也许我看的那段代码很老,xor加分块的方法速度并没有多大提升,主要还是因为需要逐一比较分块是否改变,而且之前对全图xor还导致速度的下降。

我想知道它们是如何确定需要重传的分块的,或者这个比较过程用了什么特殊的手法以加快处理速度?隔行扫描占用CPU确实很小,不过如果不判断哪些行需要重传,占用带宽还是很大的。结果又绕回如何确定是否需要重传上来了...
我对驱动不太熟悉,而且感觉这么一个小东西搬个驱动过来,有点小题大做了(我不想写远控程序,也不用进程隐藏,只要能实现高速的屏幕传输就行了(主要是刷新频率要求较高,至少每秒5-10帧吧))。看来还是要从分块隔行扫描入手。

ps: 谢谢三楼的邀请,不过我很少上QQ。你有邮箱吗?我的:upbit@126.com
2008-6-11 10:13
0
雪    币: 119
活跃值: (298)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
驱动跟dll一样 有什么小题大作的! 驱动层比应用层更简单! 只是调试较r3麻烦写!
2008-6-12 08:09
0
雪    币: 232
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感觉驱动的适应性不会太强,而且很难移植Linux(几台服务器都装的Fedora,Server端需要在Linux下运行,而且fc6还不知道有没有提供相关的接口呢)。
而且写普通截屏代码+分块隔行扫描的,也容易编程。

现在主要还是 如何确定分块是否需要重传 问题,除了比较每个象素点的内容,就没有简便快捷的方法了吗?或者xor之后有什么变通的方法?计算分块的效验和?
2008-6-13 14:13
0
游客
登录 | 注册 方可回帖
返回
//