RealVNC是如何工作的?

3

我想了解RealVNC远程查看器的工作原理。

它是否经常实时向客户端发送屏幕截图?

还是使用其他方法?


为什么会有“不是一个真正的问题”的投票?这个问题在我看来听起来还不错。 - peoro
@peoro:虽然我勉强能把这个问题理解为一个编程问题,但它与C或C++有什么关系呢? - sbi
@sbi:毫无疑问,标签是错误的,但这并不意味着这不是一个真实的问题。 - peoro
我认为这是一个适合程序员交流社区的问题,而不是适合在Stack Overflow上提问的问题。 - KevinDTimm
5个回答

8
作为一个非常高层次的概述,VNC服务器分为两种类型:
  1. 屏幕抓取。这些服务器会将当前显示内容捕获到缓冲区,将其与客户端状态进行比较,并仅将不同的矩形发送给客户端。
  2. 钩子辅助。这些服务器通过挂钩显示更新过程来获取有关屏幕更改的信息,由显示管理器或操作系统通知。然后,它们可以使用该信息仅向客户端发送已更改的矩形。
在这两种情况下,实际上是一系列屏幕更新的流;然而,只有屏幕的更改区域被传输到客户端。根据所使用的VNC协议版本,这些更新也可能被压缩。
请注意,客户端可以随时请求完整的屏幕更新,但是如果整个屏幕没有发生变化,服务器将不会主动执行此操作。
此外,屏幕更新并不是唯一传输的内容。服务器可以使用单独的通道发送剪贴板更新和鼠标位置更新(因为远程机器上的用户可能也能够移动鼠标)。

请问您能告诉我如何仅发送屏幕的更改区域吗?人们实际上是如何做到这一点的呢?假设我们可以比较两个图像并找出差异,但当我将差异发送到远程计算机时,我需要使用什么逻辑来拼接先前图像中的更改区域。我在谷歌上搜索了很多,但没有找到详细讨论人们如何做到这一点的细节。是否有任何文章可以指导我在现实生活中完成这项工作。谢谢。 - Thomas
@Thomas 这跟VNC有什么关系? - cdhowie

5
该协议的显示方面基于一个单一的图形原语:“在给定的x,y位置放置一个像素数据的矩形”。乍一看,这可能是绘制许多用户界面组件的一种低效方式。然而,允许各种不同的像素数据编码方式使我们在如何权衡各种参数(如网络带宽、客户端绘制速度和服务器处理速度)方面具有很大的灵活性。这些矩形的序列构成了一个帧缓冲区更新(或简称为“更新”)。更新表示从一个有效的帧缓冲区状态到另一个状态的更改,因此在某些方面类似于视频帧。更新中的矩形通常是不相交的,但这并不一定是这种情况。
阅读这里以了解更多信息。

4
是的。它只发送某种屏幕截图(经过压缩并重复使用前一个截图未改变的部分)。
顺便说一下,这就是VNC协议,任何客户端都可以这样工作(虽然压缩图像的实际方法等等可能会发生变化)。

2

基本上,服务器向客户端发送帧缓冲区更新,而客户端发送键盘和鼠标输入以及帧缓冲区更新请求到服务器。

帧缓冲区更新消息可以采用不同的编码方式,但本质上它们是表示像素数据的正方形屏幕区域的不同方式。通常,客户端请求整个屏幕的帧缓冲区更新,但也可以请求屏幕的部分区域(例如,小型屏幕客户端显示服务器屏幕的视口)。然后,服务器会发送一个包含自上次发送到客户端的FBU(帧缓冲区更新)之后屏幕发生变化的矩形的FBU。

RFB/VNC协议的最佳参考文献在这里。IETF有一个最近(2011年)的标准文档RFC 6143,涵盖了RFB,虽然它不像参考指南那样详尽。


1
它的基本原理是实时发送屏幕截图。这里的“实时”有点用词不当,因为没有明确的截止日期。它尝试通过仅发送屏幕上已更改的区域来进行优化,并且VNC代码线的一些分支使用镜像驱动程序接收通知,以便在写入显示区域时接收通知,而其他分支则使用窗口消息挂钩以检测重绘请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接