平原

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 实例的信息的协议。