- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对不起,长度,有点必要。
简介
我正在用 C# 4.0 为 Windows Vista/7 开发远程桌面软件(只是为了好玩)。我已经克服了基本障碍:我有一个强大的 UDP 消息传递系统,相对干净的程序设计,我有一个镜像驱动程序(来自 DemoForge 的免费 DFMirage 镜像驱动程序)启动并运行,我已经为所有人实现了 NAT 遍历除对称 NAT 之外的 NAT 类型(存在于公司防火墙情况中)。
关于屏幕传输/共享,多亏了镜像驱动程序,我会自动收到更改的屏幕区域通知,我可以简单地将镜像驱动程序不断变化的屏幕位图编码为我自己的位图。然后我将屏幕区域压缩为 PNG 并将其从服务器发送到我的客户端。事情看起来不错,但速度还不够快。它和 VNC 一样慢(顺便说一句,我不使用 VNC 协议(protocol),只是一个自定义的业余协议(protocol))。
从最慢的远程桌面软件到最快的,列表通常从所有类似 VNC 的实现开始,然后爬到 Microsoft Windows 远程桌面......然后...... TeamViewer。不太确定 CrossLoop、LogMeIn - 我没有使用过它们,但 TeamViewer 非常快。简直就是现场直播。我跑了一个 tree
命令提示符上的命令,它以 20 毫秒的延迟更新。我可以比在笔记本电脑上浏览网页慢几毫秒。在 Visual Studio 中垂直滚动代码有 50 毫秒的滞后时间。想一想 TeamViewer 的屏幕传输解决方案必须有多强大才能完成这一切。
VNC 使用基于轮询的钩子(Hook)来检测屏幕变化和暴力屏幕捕获/比较最糟糕的情况。他们最好使用像 DFMirage 这样的镜像驱动程序。我就是这个水平。他们使用一种叫做 RFB 协议(protocol)的东西。
Microsoft Windows 远程桌面显然比 VNC 高出一步。我从 StackOverflow 的某个地方听说 Windows 远程桌面不发送屏幕位图,而是实际的绘图命令。这非常棒,因为它可以只发送简单的文本(在这个坐标上绘制这个矩形并用这个渐变着色)!远程桌面确实非常快 - 这是在家工作的标准方式。它使用一种叫做 RDP 协议(protocol)的东西。
现在 TeamViewer 对我来说完全是个谜。显然,他们发布了第 2 版的源代码(截至 2012 年 2 月,TeamViewer 是第 7 版)。人们读过它并说第 2 版没用——它只是对 VNC 的一些改进,具有自动 NAT 遍历。
但是第 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 帧。我使用了网络监视器,TeamViewer 在 500 Kbps 和 1 Mbps 的速度下仍然没有延迟(VNC 软件在该传输速率下延迟几秒钟)。在我的 tree
命令提示符测试中,TeamViewer 以 1 Mbps 的速率接收入站数据,并且仍以 5-6 fps 的速度运行。 VNC 和远程桌面不会这样做。那么,如何?
答案会有些复杂和错综复杂,所以如果您只是想说这是因为他们使用 UDP 而不是 TCP,请不要发布您的 0.02 美元(您是否相信他们实际上确实使用 TCP 也同样成功)。
我希望 StackOverflow 上的某个地方有一个 TeamViewer 开发人员。
潜在答案
一旦人们回复,将更新此内容。
最佳答案
这里最根本的可能是你不想传输静态图像而只想对图像进行更改,这本质上类似于 视频流 .
我最好的猜测是一些非常有效(并且高度特化和优化)的运动补偿算法,因为通用桌面使用中的大部分实际变化是元素的线性移动(滚动文本、移动窗口等,与元素的转换相对)。
1 FPS 的 DirectX 3D 性能似乎在一定程度上证实了我的猜测。
关于performance - TeamViewer 怎么这么快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9498877/
我找到了这个: How does teamviewer find my computer 但我无法理解,答案也不是我想要的。 我正在 .net 中寻找解决方案。 如果我有一个 image-Sender
我正在从远程位置到Mac播放电视,以使用XCode(在Windows PC上)玩耍。在界面构建器中,我正在尝试执行控件拖动操作。我尝试按ctrl按钮并拖动 View Controller ,但没有任何
对不起,长度,有点必要。 简介 我正在用 C# 4.0 为 Windows Vista/7 开发远程桌面软件(只是为了好玩)。我已经克服了基本障碍:我有一个强大的 UDP 消息传递系统,相对干净的程序
我正在使用适用于 iOS 的 Teamviewer 应用程序,我注意到他们在您等待连接到计算机时使用某种加载弹出 View 此外,当您要关闭连接时,会出现另一种带有“关闭”按钮的弹出 View 。 c
有人知道是否可以从您的网站打开 teamviewer session 吗?我在表格中找到了一些 Teamviewer ID。如果我可以从我的网站在我的笔记本电脑上打开 teamviewer,那就太好了
我正在尝试使用 teamviewer 12.0.81460 连接到我的远程服务器。它曾经工作得非常好。但是从过去几天开始,当我使用 TeamViewer 连接时,我看到黑屏(见附件截图)。但是当我移动
有没有一种方法可以在 android 中启动“teamviewer”应用程序(或其他可让您远程控制手机的类似应用程序),指定控制设备所需的“用户 ID”和密码? 例如: Intent i = getP
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
是否可以通过 Team viewer 访问通过 Vagrant/Oracle Virtualbox 在我的 Windows 机器上安装的 Ubuntu,以便我可以实际看到 Ubuntu GUI? 最佳
有一个问题是如何start, Teamviewer from commandline, to make outward connections ,但是我想从命令行启动 Teamviewer(因此它可以
Teamviewer Linux 具有安装永久运行的守护进程的恼人特性。这不仅消耗资源,而且存在安全风险。您可以禁用守护程序启动,但是 teamviewer 客户端将不再工作。 最佳答案 最好的方法是
对于那些不知道我在说什么的人: http://www.teamviewer.com/images/presse/quickconnect_en.jpg Teamviewer 将该按钮覆盖在所有窗口上,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我的国家禁止VOIP,所以基本上我不能进行音频或视频聊天。但是在使用 Teamviewer 时,总是可以进行音频和视频 session ,所以我想知道这怎么可能,以及用于允许我进行音频和视频聊天的 V
我注意到 TeamViewer 有一些奇怪的地方。如果有人拥有 TeamViewer 帐户,他/她可以仅使用 ID 添加伙伴,然后始终看到该伙伴的状态,即计算机是在线还是离线。 我还没有想出 Team
我们公司有数百台 Teamviewer Host。一些用户变得如此聪明,并更改了密码以相互连接......这对我们来说很难连接到主机,而且他们使用如此弱的密码,所以这是一个安全问题! 有什么方法可以扫
我正在寻找一种使用 python 中的 postman 代码片段来解析多个 API 请求的方法。 以下作品: import http.client conn = http.client.HTTPSCo
我正在开发一个 GUI,我需要 GUI 能够在 Teamviewer 崩溃时重新启动它。 我尝试使用团队查看器“备忘单”上的内核命令来执行此操作 import tkinter as tk import
(C#) 您好,我想将 Teamviewer 合并到我的获胜表单中。 这是怎么做到的? 以下代码适用于记事本或画图等其他应用程序......但 TeamViewer 无法正常工作。 namespace
我们软件的一位客户提示说软件在他的 Windows XP 机器上崩溃了。我让他下载ProcDump并通过它运行我们的流程: procdump -e -ma -w myproc.exe 为此,用户通过电
我是一名优秀的程序员,十分优秀!