Compositing

来自osdev
跳到导航 跳到搜索

这个页面正在建设中! 此页面或部分内容仍在改进中,因此可能还不完整。 其内容可能会在不久的将来更改。

Compositing是一种提供窗口化GUI的方法,其中每个应用程序窗口都有自己的专用缓冲区 - 有时称为surfacecanvas - 它可以随心所欲地画画。(译者注:好像在应用层开发中不怎么这样用这些术语,所以保留原文了。或者翻译为“图形复合功能”) 然后,“合成器(compositor)”将这些缓冲区组合在一起,以生成最终图像并显示在屏幕上。 第一个使用合成“窗口管理器”的主要系统是Amiga,它使用硬件显存块移动单元(blitter)来合成窗口。 值得注意的是,OS X是三个主流OS(译者注:应该是IOS、Windows和Linux)中第一个附带合成窗口管理器的功能,这是它自首次发布以来的一项功能。 其他早期主流合成器包括Compiz(第一个广泛使用的专用X11合成器)和DWM(Windows合成器)。

概述

之所以这样称呼合成器,是因为它们将窗口 “合成(composite)” 在一起以形成屏幕上显示的图像。 为了做到这一点,每个窗口都需要一个用于绘制的专用缓冲区。 因此,合成器需要为要显示的每个新窗口提供更多内存(系统内存或图形内存)。 与传统窗口管理相比,合成的主要好处是区域化作用(compartmentalization)。 由于每个窗口都有自己的要绘制的缓冲区,并且由于合成器完全控制了最终图像,因此在合成窗口管理器时通常不会看到传统窗口渲染的典型伪像,例如“IE6效果”(译者注:不知道具体指的是什么不良显示效果),因为窗口管理器在移动窗口时不需要等待或请求重新绘制先前裁剪或覆盖的区域。 合成的另一个好处是,它允许窗口管理器在合成时执行各种转换或渲染效果,例如alpha混合,旋转,缩放,复制等。

先决条件

如果您想要构建一个合成器,您将需要一些东西:

  • 视频内存访问 - 合成器本身需要能够访问视频内存,或者有一些接口来绘制屏幕。
  • 内存共享 - 图形内存的接口在技术上优于系统内存,但是实现起来要困难得多,并且需要对图形硬件有透彻的了解。 不管怎样,您都需要一个接口,通过该接口,两个进程可以读取和写入相同的内存区域 (或者至少,一侧需要能够写入至少一个区域,而另一侧需要能够读取多个这样的区域)。 您将需要能够支持许多区域,甚至超过显示器的像素大小。 这些共享内存区域的格式将在后面讨论。
  • 消息传递、流或套接字 - 在服务器和各个客户端之间发送消息需要某种形式的同步和快速IPC(进程间通信)。 最好使用设计为针对单个服务器和多个(可能是恶意或矛盾的)客户端一起工作的系统。 客户端将使用此接口发送诸如“给我一个窗口”之类的命令,服务器将使用此接口发送诸如“按下Alt+F4”或“鼠标移动到x=259y=530”之类的事件。

设计决策

在合成窗口管理器中有两个关键的设计决策要考虑。 (尽管它们也可以适用于其他类型的窗口管理器):

  • 画布格式 - 图形库使用了很多不同的像素格式,从RGBA32(每像素8位,带有alpha通道)到YUV12。 您可以选择支持其中的许多或仅支持一个,但请注意,除了用于合成的原生格式之外,任何其他内容都需要在某个地方进行转换。
  • Window 装饰 - 大多数传统的窗口管理器(堆叠和合成)在服务端中渲染装饰,但相对较新的方法是让客户端渲染它们自己的边界。 前者将复杂性转移到服务端中,可能要求windows具有子部分,并要求合成器了解不同的 “窗口类型” (请参阅各种X11合成器)。 客户端装饰要求客户自行渲染,这就要求客户以某种方式合作确定装饰的主题(参见Wayland,Quartz)。 当然,另一种方法是根本没有装饰品,这在一些Unix技术人群中是一个很受欢迎的风格决策。