GDI Remote 简介

  • 概要

基本的显示驱动工作在单线程模式下,GDI有一个全局锁(光标工作在另一个线程,不在GDI的全局锁范围内)。

     GDI
      |
      |
      V
Display driver <----> Server--->Client.

GDI指令先用标准的软件驱动渲染到本地表面中,然后,将这些指令封装成一定的格式,组织成一定的协议(RPD\Spice\thinwire,PCoIP仅传送位图),发送到客户端渲染、显示。

本地渲染之所以不可缺少,是因为大多的协议都不会支持所有的GDI指令,少数指令占据了指令总数的大部分,有些高级指令的实现不但麻烦,也不能减低流量。因而需要将本地渲染好的表面数据发送到客户端。还有些截屏的应用程序,需要获取主表面数据,如果无本地渲染,则需要从客户端传送相应数据。

离屏表面

支持离屏表面会消耗更多的内存,然而离屏表面通常能减少VM和客户端之间的数据传输量。

图形对象

GDI Remote 需要支持的图形对象有:位图、Clip、Line、调色板、文字等。

客户端缓存

客户端缓存可以由VM中的服务端管理,为了减少流量,可以给缓存编一个16位的标志号。

服务端缓存

服务端需要管理缓存的更新,可以用CRC来区别不同的缓存对象。

设备表面管理

设备表面是由驱动自己管理的表面。

帧管理

可以减少客户端的帧数以降低流量。

在带宽不够时,也可以丢帧。

  • 图像压缩算法

计算机图形压缩比较好的算法为RLE算法,自然图像多用JPEG压缩,RDP也用JPEG-XR。

由于人类对文字比较敏感,压缩后的同一幅图像,人们往往感觉文字比较模糊。有些压缩算法会将图形、图像、文字区分开,分别采用不同的压缩算法进行压缩。

PCoIP比较核心的部分就是其分类的图像、视频压缩算法。

  • 缓存

缓存在GDI Remote中非常重要,如果没有缓存,流量将达到几百Mbps。

简单的大图缓存机制(如Spice的二次命中,LRU)可以将流量降到数M到数十Mbps。

简单的分块缓存能进一步降低流量

然而分块缓存并没有充分利用客户端图像信息,简单分块缓存的改进版(可以称之为Supercache吧)能更完美降低流量。

(有时间专门写一下这里)

  • 指令整合

Windows中,GDI指令可能出现下一条指令完全覆盖上一条指令或者部分区域的情况。也就是说,我们仅需要将前一条指令的未被后面的指令覆盖的相应数据发送到客户端渲染即可(Spice\maybe thinwire)。

多条连续相同指令也可以合并起来以减少数据量。

指令消除(Some times later)。

  • 流量控制

如果VM和客户端间的带宽不够怎么办? 例哪播放高清视频。

流控大致有如下方案:丢帧、加强压缩、驱动卡一下(让视频播放器丢帧)。

你可能感兴趣的:(remote,rdp,gdi,spice,桌面云,thinwire)