Flatland 是 Sense 的 2D Composition API。Flatland 为 Fuchsia 的图形客户端提供了功能,用于构建场景图并提交到 Views。然后,Scape 会将这些图像组合成一个统一的场景图,并将其呈现在屏幕上。
- 用于合成缓冲区内容的 2D API
 - 保留模式
 - 全局场景图,内容分布在组件之间
 - 专注于效率和控制
 
背景
使用 fuchsia.ui.gfx 命名空间(以下简称“Gfx API”)下的 3D API,提供风景优美的图形客户端。
不过,Fuchsia 的现有客户从根本上说都是 2D 产品。这会导致 Scenic 的 3D 场景表示与用户体验的 2D 表示不匹配。Fuchsia 认为,从产品和性能的角度来看,Gfx API 不再适用于对“街景”提出的需求。如需详细了解此决定,请参阅 Flatland 路线图条目。Fuchsia 的所有图形客户端都正在迁移到 Flatland API。
设计
Flatland 的目标是提供仅针对 2D 矩形图层进行优化的轻量级合成 API。
Flatland 客户端创建的内容具有位于 X/Y 的矩形图层。它们提交其内容,目标是在未来的 vsync 中传送到显示屏。每个 Flatland 客户端的内容都会单独提交给 Views。
作为系统合成器,景观图会处理这些场景图,以生成统一的场景图。“风景”可能会将这些图形图层直接传递给显示屏。否则,Sense 可能会使用 Vulkan 将这些图形内容渲染到提交到显示设备的单个层。

以下是围绕 Flatland API 作出的一些设计决策:
- Flatland API 使用的结构如下:先在服务器上加入队列,然后执行提交调用 (Present())。与 GFX 不同,它不提供命令联合模式或客户端排队。
 - Flatland 是有状态的。客户端可以在 Present() 调用之间对其场景图进行增量更改。
 - Flatland 的目标是尽可能将合成工作委托给视频显示控制器 (VDC) 硬件。这样做可以降低 Views 的 GPU 使用量,并将硬件提供给系统的其余部分。Flatland 与 VDC 密切遵循并提供类似于 VDC 的功能,后者在严格的 2D 范式中运行。
 - Flatland 的目标是为客户端提供确定性的 CPU 费用。有一个按时限安排的渲染线程。每个 Flatland 会话均在各自的调度程序上运行,这样可防止它们相互影响彼此的提交内容。
 - 图片分配是通过在 
fuchsia.ui.composition/Allocator下定义的 Views 的分配器协议执行的。传输图片资源时不会创建副本。 
协议
Flatland
用于创建和提交 2D 场景图的主协议。连接到 Flatland 协议并不意味着提交的内容可以到达屏幕。Flatland 实例仍应通过创建其自己的视图来连接到全局视图树。
ViewBoundProtocol
在此 Flatland 实例中创建的 View 上运行的输入协议。
父级 ViewportWatcher
用于向子级 Flatland 实例提供父级 Flatland 实例的相关信息的协议。
ChildViewWatcher
用于向父级 Flatland 实例提供子级 Flatland 实例的信息的协议。