表面的生命周期
我们在前面提到,Wayland 的设计是为了原子化地更新所有的东西,这样就不会有无效或者中间状态的帧出现。正是 wl_surface
本身的机制保障了应用程序窗口和其他表面多种属性配置时原子性。
每个表面都有一个待定状态和一个应用状态,而在它刚被创建的时候则无任何状态。待定状态是通过客户端的请求和服务端的事件来协商的,当双方都认为它代表一个一致的表面状态时,表面就会被提交——待定状态会被应用到表面的当前状态。在这之前,混成器将继续渲染最后的一致状态;一旦提交,将从下一帧开始使用新的状态。
其中原子操作更新的状态有:
- 所附加的
wl_buffer
或构成表面内容的像素 - 在上一帧中被 “破坏” 的区域,需要重新绘制。
- 接受输入事件的区域。
- 被认为是不透明的区域 1
- 对附加的
wl_buffer
进行变换,以旋转或呈现缓冲区的一个子集 - 缓冲区的缩放系数,用于高分辨率 (HiDPI) 显示。
除了表面的这些特征之外,表面的角色还可以有额外的双缓冲区。所有这些状态,以及与角色相关的任何状态,都会在发达送 wl_surface.commit
时应用。如果你改变主意,你可以多次发送这些请求,当表面最终被提交的时候只会考虑这些属性的最新值(即可最后一次提交有效)。
当你第一次创建表面时,初始状态是无效的。为了使其有效(或映射到表面),你需要提供必要的信息来初次为该曲面建立一致的状态。这包括给它一个角色(比如 xdg_toplevel
),分配和附加一个缓冲区,以及配置该表面的任何角色特定状态。当你发送了一个 wl_surface.commit
并正确配置了这个状态时,这个表面就会生效(或被映射)并被混成器呈现。
下一个问题是:我该何时准备一个新的帧?
1
这是以优化混成器为目的而采取的措施