- 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/
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 8年前关闭。 Improve t
暂时忘记能力的定义,只关注能力的“检查”(使用“授权!”),我看到 CanCan 添加了大约 400 毫秒,用于简单地检查用户是否具有特定的能力主题/模型。 这是预期的吗(我假设不是)?或者,有没有可
我正在阅读有关 Swift 的教程 ( http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start ),它预定义为不显式设置类型,因
这主要是由于对 SQL 问题的回答。由于性能原因,有意省略了 UDF 和子查询。我没有包括可靠性并不是说它应该被视为理所当然,但代码必须工作。 性能永远是第一位的吗?提供了许多以性能为主要优先事项的答
我已经编写了一个简单的测试平台来测量三种阶乘实现的性能:基于循环的,非尾递归的和尾递归的。 Surprisingly to me the worst performant was the loop o
我已将 ui-performance 插件应用到我的应用程序中。不幸的是,在开发模式下运行应用程序时它似乎不起作用。例如,我的 javascript 导入是用“vnull”版本呈现的。 例如 不会
我有一个我操作的 F# 引用(我在各处添加对象池以回收经常创建和删除的短期对象)。我想运行结果报价;现在我使用了 F# PowerPack,它提供了将引用转换为表达式树和委托(delegate)的方法
我正在尝试在 Spark 服务器上运行 SparklyR 库中的机器学习算法。 1 个簇 8 核 24G内存 Ubuntu 16.04 星火2.2 独立配置 1名师傅/2名 worker 每个执行器的
我有一个数据库(准确地说是在 postgres 上运行),具有以下结构: user1 (schema) | - cars (table) - airplanes (table, again) .
我的应用程序在我的 iPad 上运行。但它的表现非常糟糕——我的速度低于 15fps。谁能帮我优化一下? 它基本上是一个轮子(派生自 UIView),包含 12 个按钮(派生自 UIControl)。
在完成“Scala 中的函数式编程原则”@coursera 类(class)第 3 周的作业时,我发现当我实现视频类(class)中所示的函数联合时: override def union(tha
我正在重构我的一个 Controller 以使其成为一项服务,我想知道不将整个服务容器注入(inject)我的 Controller 是否会对性能产生影响。 这样效率更高吗: innova.path.
我有一个要显示的内容很大的文件。例如在显示用户配置文件时, 中的每个 EL 表达式需要一个 userId 作为 bean 的参数,该参数取自 session 上下文。我在 xhtml 文件中将这个 u
我非常了解 mipmapping。我不明白(在硬件/驱动程序级别)是 mipmapping 如何提高应用程序的性能(至少这是经常声称的)。在执行片段着色器之前,驱动程序不知道要访问哪个 mipmap
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: What's the (hidden) cost of lazy val? (Scala) Scala 允许定义惰
一些文章建议现在 build() 包含在 perform() 本身中,而其他人则建议当要链接多个操作时使用 build().perform()一起。 最佳答案 build() 包含在 perform(
Postgres docs说 For best optimization results, you should label your functions with the strictest vol
阅读Zero-cost abstractions看着 Introduction to rust: a low-level language with high-level abstractions我尝
我想在 MQ 服务器上部署 SSL,但我想知道我当前的 CPU 容量是否支持 SSL。 (我没有预算增加 CPU 内核和 MQ PVU 的数量) 我的规范: Windows 2003 服务器 SP2,
因此,我在 Chrome 开发者工具 的性能 选项卡内的时间 部分成功地监控了我的 React Native 应用程序的性能。 突然在应用程序的特定重新加载时,Timings 标签丢失。 我已尝试重置
我是一名优秀的程序员,十分优秀!