抱歉长了点,这是必须的。
简介
我正在用 C # 4.0为 Windows Vista/7开发一个远程桌面软件(只是为了好玩)。我已经克服了一些基本的障碍: 我有一个强大的 UDP 消息系统,相对简洁的程序设计,我有一个镜像驱动程序(来自 DemoForge 的免费 DFMirage 镜像驱动程序) ,我已经实现了除对称 NAT (存在于企业防火墙情况下)以外的所有 NAT 类型的 NAT 遍历。
关于屏幕传输/共享,多亏了镜像驱动程序,我会自动获得屏幕区域变化的通知,我可以简单地将镜像驱动程序不断变化的屏幕位图编组到我自己的位图中。然后我将屏幕区域压缩为 PNG 格式,并将其从服务器发送到我的客户端。情况看起来不错,但还不够快。它和 VNC 一样慢(顺便说一下,我没有使用 VNC 协议,只是一个自定义的业余协议)。
从速度最慢的远程桌面软件到速度最快的,列表通常从所有类似 VNC 的实现开始,然后爬到 Microsoft Windows Remote Desktop... 然后... TeamViewer。不太确定是否使用 CrossLoop,LogMeIn-我没有使用过它们,但 TeamViewer 是 疯狂的快速浏览器。简直就是现场直播。我在命令提示符上运行了 tree
命令,它更新了20毫秒的延迟。我浏览网页的速度只比笔记本电脑慢几毫秒。在 VisualStudio 中垂直滚动代码有50毫秒的延迟时间。考虑一下 TeamViewer 的屏幕传输解决方案必须有多强大才能完成所有这些工作。
VNC 使用基于轮询的钩子来检测屏幕变化,并在最糟糕的情况下强行捕捉/比较屏幕。在最好的情况下,他们使用像 DFMirage 这样的镜像驱动程序。我已经到这个水平了。他们使用 RFB 协议。
MicrosoftWindowsRemoteDesktop 显然比 VNC 高一级。我从 StackOverflow 的某个地方听说,Windows 远程桌面不发送屏幕位图,而是发送实际的绘图命令。这是相当辉煌的,因为它可以只发送简单的文本(绘制这个矩形在这个坐标和颜色与这个渐变) !远程桌面确实非常快,而且是在家工作的标准方式。它使用了 RDP 协议。
现在 TeamViewer 对我来说完全是个谜。显然,他们发布了版本2的源代码(TeamViewer 是2012年2月的版本7)。人们已经读过它,并且说版本2是无用的——它只是对带有自动 NAT 遍历的 VNC 的一些改进。
但是第七版... 现在快得离谱。我的意思是,它实际上比 Windows 远程桌面更快。我用 TeamViewer 流媒体播放 DirectX 3D 游戏(1fps,但 Windows 远程桌面甚至不允许 DirectX 运行)。
顺便说一下,TeamViewer 所做的这一切 没有镜像驱动程序。有一个选项来安装一个,它只是得到了一点点快速。
问题
我的问题是 TeamViewer 怎么会这么快?这是不可能的。如果在24位深度(16位深度将是明显的丑陋)下得到1920 × 1080分辨率,那仍然是6,220,800字节的原始数据。即使使用 libjpeg-turbo (大公司使用的最快的 JPG 压缩库之一) ,将其压缩到30KB (让我们非常慷慨地) ,也需要花费时间通过 TeamViewer 的服务器(TeamViewer 绕过公司的对称 NAT,通过简单地代理服务器的流量)。而且 libjpeg-turbo 压缩需要时间来压缩。高质量的 JPG 压缩需要175毫秒的完整1920年由1080截图为我。如果主机的计算机运行 Atom 处理器,这个数字就会上升。我只是不明白 TeamViewer 是如何优化他们的屏幕传输的。同样,小尺寸图像可能被高度压缩,但压缩至少需要几十毫秒。大尺寸的图像不需要时间压缩,但需要很长的时间才能看完。不知何故,TeamViewer 完成了整个过程,得到了大约20-25个帧率。我使用了网络监视器,TeamViewer 在500Kbps 和1Mbps 的速度下仍然没有延迟(在这种传输速率下,VNC 软件会延迟几秒钟)。在我的 tree
命令提示符测试期间,TeamViewer 以1Mbps 的速率接收入站数据,并且仍然运行5-6fps。VNC 和远程桌面不这样做。那么,怎么做?
答案会有点复杂和错综复杂,所以 如果你只是想说因为他们使用 UDP 而不是 TCP,请不要发布你的 $0.02(你会相信他们实际上使用 TCP 一样成功)。
我希望在 StackOverflow 上有一个 TeamViewer 开发人员。
潜在答案
人们回复后会更新这个。