很抱歉篇幅有点长,但这是必须的。
介绍
我正在为Windows Vista/7使用C# 4.0开发远程桌面软件(只是出于兴趣)。我已经克服了基本的障碍:我拥有一个强大的UDP消息系统,相对清晰的程序设计,我安装了镜像驱动程序(来自DemoForge的免费DFMirage镜像驱动程序),并实现了NAT穿透,面向除了对称NAT(存在于企业防火墙)之外的所有NAT类型。
关于屏幕传输/共享,由于有了镜像驱动程序,我可以自动获取更改的屏幕区域,并简单地将镜像驱动程序的不断变化的屏幕位图转移到我的位图中。然后,我将屏幕区域压缩为PNG格式,并从服务器发送到客户端。看起来很不错,但速度不够快。它和VNC一样慢(顺便说一下,我不使用VNC协议,而是自定义的业余协议)。
从最慢的远程桌面软件到最快的软件,通常以所有类似于VNC的实现开始,然后上升至Microsoft Windows远程桌面......然后是TeamViewer。至于CrossLoop、LogMeIn - 我没有使用过它们,但TeamViewer速度非常快。这实际上是实时的。我在命令提示符中运行了一个tree
命令,它以20毫秒的延迟进行更新。我可以比我的笔记本电脑慢几毫秒来浏览网页。在Visual Studio中垂直滚动代码有50毫秒的延迟时间。想想TeamViewer的屏幕传输解决方案必须要多么强大才能完成所有这些。
VNC使用基于轮询的钩子来检测屏幕变化,并在最糟糕的情况下采用蛮力屏幕捕获/比较。在最好的情况下,它们使用像DFMirage这样的镜像驱动程序。我处于这个水平。他们使用称为RFB协议的东西。
微软的远程桌面似乎比VNC更进一步。我从StackOverflow上听说,Windows远程桌面不会发送屏幕位图,而是实际的绘图命令。这非常聪明,因为它可以只发送简单的文本(在这个坐标处绘制矩形并用这个渐变色彩填充)!远程桌面真的很快,而且它是在家里工作的标准方式。它使用一种叫做RDP协议的东西。
现在,TeamViewer对我来说完全是个谜。显然,他们发布了第2版的源代码(截至2012年2月,TeamViewer是第7版)。人们已经阅读了它,并说第2版是无用的——它只是在自动NAT穿透方面有了一些改进,超过VNC只有一点点。
但是第7版……现在它速度非常快。我的意思是,它实际上比Windows远程桌面还要快。我用TeamViewer流式传输DirectX 3D游戏(1 fps),但Windows远程桌面甚至不允许DirectX运行。
顺便说一句,TeamViewer所有这些都没有使用镜像驱动程序。有一个选项可以安装一个驱动程序,速度会稍微快一点。
问题
我的问题是,TeamViewer是如何做到如此快速的?这似乎是不可能的。如果您有1920 x 1080分辨率,即使是24位深度(16位深度会明显很丑),仍然需要6,220,800字节的原始数据。即使使用libjpeg-turbo(一种最快的JPG压缩库,由大型企业使用),将其压缩到30KB(非常慷慨),也需要时间通过TeamViewer的服务器进行路由(TeamViewer通过简单地通过其服务器代理流量来绕过公司对称NAT)。而且,libjpeg-turbo压缩需要时间。高质量的JPG压缩对于我来说需要175毫秒才能完成1920 x 1080的全屏截图。如果主机计算机运行Atom处理器,则该数字会增加。我根本不明白TeamViewer如何如此优化其屏幕传输。同样,小尺寸的图像可能会被高度压缩,但至少需要数十毫秒才能压缩。大尺寸的图像不需要时间来压缩,但需要很长时间才能完成。不知何故,TeamViewer完成了整个过程,每秒获得大约20-25帧。我使用了网络监视器,以500 Kbps和1 Mbps的速度使用TeamViewer仍然没有延迟(VNC软件在传输速率为那个时会有几秒钟的延迟)。在我的tree命令提示符测试期间,TeamViewer以1 Mbps的速率接收入站数据,仍以5-6 fps运行。 VNC和远程桌面做不到这一点。所以,怎么做到的?答案可能会比较复杂和复杂,请不要发表您的2美分,如果您只会说它是因为他们使用UDP而不是TCP的话(您会相信他们实际上也同样成功地使用TCP)。
希望StackOverflow上有TeamViewer的开发人员。