图像子系统

graphics subsystem

不像Spice服务器的其他子系统,图像子系统跟服务器平行运行,在专用的线程上(例如:red worker)。这种结构提供了QEMU流与接收的图像命令处理和渲染过程的独立性,后者会耗费大量的CPU资源。

上图展示了Spice服务器图像子系统的结构。Red server初始化了调度器在一个新的QXL接口上。调度器为接口创建了Red worker线程。

worker线程执行的命令来源有:

  1. 同步的QXL设备命令
  2. Red Server命令(1和2都是调度器通过socket发送的)
  3. 异步的QXL设备命令,通过worker使用接口从QXL设备环中获取。

Red Worker(red_worker.c)

Spice服务器对每个QXL设备实例都有一个对应的red worker

red worker的功能有:

  • 处理QXL设备命令(绘图,更新,指针等)
  • 处理从调度器收到的消息
  • 通道传输
  • 管理Display 和 Cursor 通道
  • 图像压缩(使用 quic, lz, glzencoding)
  • 视频流-识别,编码和流创建
  • 缓存-客户端共享像图缓存,指针缓存,调色板缓存
  • 图像移除优化-正在使用项树,容器,阴影,临界区域,不透明项。
  • Cairo 和 OpenGL渲染-canvas,surface
  • 对于环的操作

Red Dispathcher(red_dispatcher.c)

  • 调度器与QXL设备实例一对一
  • 从QXL设备和Reds中封装worker内部构件
  • 为每个QXL设备实例初始化一个worker并创建一个worker线程
  • 使用socketpair分发给worker
  • QXL设备使用QXLWorker接口,这个接口在red dispathcher中实现,它把设备调用翻译成消息通过red worker管道传输。这种方式使QXL设备和调度器分开并且逻辑上独立。
  • Reds使用定义在red_dispatcher.h中的接口来使用调度器的功能如调度器初始化,改变图像压缩率,改变视频流状态,鼠标模式设置,额外渲染。