图像子系统
不像Spice服务器的其他子系统,图像子系统跟服务器平行运行,在专用的线程上(例如:red worker)。这种结构提供了QEMU流与接收的图像命令处理和渲染过程的独立性,后者会耗费大量的CPU资源。
上图展示了Spice服务器图像子系统的结构。Red server初始化了调度器在一个新的QXL接口上。调度器为接口创建了Red worker线程。
worker线程执行的命令来源有:
- 同步的QXL设备命令
- Red Server命令(1和2都是调度器通过socket发送的)
- 异步的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中的接口来使用调度器的功能如调度器初始化,改变图像压缩率,改变视频流状态,鼠标模式设置,额外渲染。