我正在编写一个能够与 RFB 客户端通信的 RFB 服务器。主要问题如下:目前我能够以RAW格式捕获整个屏幕并将其发送给客户端。这个速度太慢了。此外,客户端将增量发送为假。我想知道 a) 什么是服务器检测屏幕已更改的最佳方法?b) 如何只向客户端发送更改屏幕信息。
我知道该查询询问了很多信息,但我的主要观点仍然是了解逻辑以使服务器能够仅发送增量更新并检测该屏幕已更改。我正在使用 C/C++
我正在编写一个能够与 RFB 客户端通信的 RFB 服务器。主要问题如下:目前我能够以RAW格式捕获整个屏幕并将其发送给客户端。这个速度太慢了。此外,客户端将增量发送为假。我想知道 a) 什么是服务器检测屏幕已更改的最佳方法?b) 如何只向客户端发送更改屏幕信息。
我知道该查询询问了很多信息,但我的主要观点仍然是了解逻辑以使服务器能够仅发送增量更新并检测该屏幕已更改。我正在使用 C/C++
这是一个简单的逻辑,您可以使用它来查找增量更新
1.) 将最后一个已知的帧缓冲区存储为 refrenceBuffer。
2.) 每当客户端请求增量帧缓冲区时,请执行第 3 步。
3.) 捕获当前帧缓冲区并比较它是否与 refrenceBuffer 不同
4.) 如果两个帧缓冲区都继续当前帧缓冲区捕获并与 refrenceBuffer 进行比较,直到发生任何变化(最好在单独的线程中执行此操作,您可以添加几毫秒以防线程太重。)
5.) 逻辑比较可以是简单的位比较,然后找到包含所有这些变化的最大矩形(您只能在矩形上将这个发送给客户端)
这取决于您使用的系统以及您如何抓取屏幕。有很多方法可以做到这一点。大多数涉及保留您发送给客户端的内容的缓冲区,并将其与当前屏幕上的内容进行比较。
最天真和最简单的代码示例(我认为)是将屏幕简单地保存在小缓冲区中。假设您有一个代表屏幕的 1024 x 1024 像素帧缓冲区。因此,除了保留 (1) 个 1024 x 1024 的屏幕缓冲区外,您还保留了 (256) 个大小为 64 x 64 的缓冲区。
每次更新大缓冲区时,将其与小缓冲区进行比较,如果发生更改,则将该部分复制到小缓冲区中并将其发送给客户端。
如何检测屏幕是否发生变化在其他答案中介绍。
客户端通常会在第一次更新时发送一个带增量 = false 的 UpdateRequest,因为它想从头开始绘制整个事物。一旦它收到一个覆盖整个屏幕的矩形,它就应该切换到只请求增量。