RFB协议:发送增量帧缓冲更新

时间:2013-05-25 04:25:05

标签: encoding framebuffer

我正在编写一个能够与RFB客户端通信的RFB服务器。主要问题如下: 目前,我能够以RAW格式捕获并将委托屏幕发送到客户端。速度对此非常缓慢。此外,客户端正在发送增量为false。我想知道 a)什么是最好的方法,以便服务器检测到屏幕已经改变? b)如何仅将更改屏幕信息发送给客户端。

我知道查询要求很多信息,但我的主要观点是知道LOGIC以使服务器能够仅发送增量更新并检测屏幕是否已更改。 我在C / C ++工作

3 个答案:

答案 0 :(得分:0)

这是一个简单的逻辑,您可以使用它来查找增量更新

1。)将最后一次已知的帧缓冲存储为refrenceBuffer。

2.。)每当客户端请求增量帧缓冲时,请执行步骤3.

3.)捕获当前帧缓冲并比较它是否与refrenceBuffer

不同

4。)如果帧缓冲区继续当前帧缓冲区捕获并与refrenceBuffer进行比较直到发生任何更改(最好在单独的线程中执行此操作,则可能会添加几毫秒,因为线程太重。)

5.。)逻辑比较可以是简单的比特比较,然后找到包含所有这些变化的最大矩形(你只能在矩形上发送给客户端)

答案 1 :(得分:0)

这取决于您正在使用的系统以及如何抓取屏幕。有很多方法可以实现这一目标。大多数都涉及保留已发送给客户端的缓冲区,并将其与屏幕上当前的内容进行比较。

最简单,最简单的代码示例(我认为)就是将屏幕保持在小缓冲区中。假设你有一个代表屏幕的1024 x 1024像素帧缓冲区。因此,除了保持屏幕上的(1)1024 x 1024缓冲区外,还保留(256)大小为64 x 64的缓冲区。

每次更新大缓冲区时,都要将它与小缓冲区进行比较,如果发生变化,则将该区域复制到小缓冲区并将其发送给客户端。

答案 2 :(得分:0)

如何检测屏幕是否已更改,将在其他答案中介绍。

客户端通常会在第一次更新时发送带有incremental = false的UpdateRequest,因为它想要绘制整个内容。 一旦它收到一个覆盖整个屏幕的矩形,它就应该切换到要求增量。