风景优美的 Fuchsia 系统合成器

简介

Frameworks 是一项系统服务,其主要职责是管理由平台上的所有应用以及 SysUI 共用的全局场景图。此场景图可以协调应用在屏幕上显示内容的方式、它们如何接收来自用户的输入事件,并且还支持其他 Fuchsia 系统组件的功能。它是客户端之间几何/拓扑关系的“可信来源”。

风景优美的责任

合成

smooth 为客户端(应用、SysUI)提供用于操控全局场景图(位于某个 View)的子图的 API。在该子图中,他们可以附加图形内容,并嵌入由其他组件提供的 View。这种嵌入是递归的:组件关联到其父组件的方式与关联到其子组件的方式相同。

渲染/显示

为了最大限度地提高效率,Sce 可以将客户端图片直接呈现到显示控制器,而无需启动 GPU!但是,由于各种原因,这并非总是可行。View 会动态决定每一帧是可以直接显示客户端提供的图像,还是必须与 GPU 进行合成。

视觉效果

Views 负责处理无法嵌入客户端提供的内容中的视觉效果。例如,Sensing 的(已废弃)GFX API 允许客户端将内容插入 3D 场景中,在该场景中,不同应用中的对象可以投射阴影并相互反射光。同样,Flatland 旨在支持“组不透明度”等效果。

此类影响的列表目前有限,但将来会不断增加。

展示广告管理

Fuchsia 的 Display Controller API 仅限于单个连接的客户端。由于 Scenic 需要以低延迟方式每帧显示内容,因此 Scenic 只能连接到显示控制器。不过,这意味着,Scape 必须充当需要与屏幕控制器进行交互的任何其他方的代理。例如,SysUI 必须让用户能够: - 查看连接了哪些屏幕 - 为每个屏幕选择分辨率和刷新率 - 排列屏幕在虚拟桌面中的相对位置

帧调度

View 功能、客户端和显示控制器必须共同协作来调度帧,以最大限度减少延迟时间和内存使用等。Sce

帧调度更详细地探讨了这一主题。

输入

应用在场景图中的位置会影响输入事件(例如鼠标触摸事件)传送到应用的方式。例如: - 客户端会在其视图的坐标系中收到输入事件;Sceens 会将输入流水线中的入站事件转换为适当的坐标系。 - 在场景图拓扑中的位置很重要:位于另一个视图“上方”的视图将优先接收该事件 - “点按并拖动”等持续手势会将所有手势事件发送到相同的目标视图,即使用户的手指移到目标视图的边界之外。

无障碍功能

View 提供了可供无障碍功能管理器用于实现各种功能的功能。例如,Scape 公开了支持“屏幕阅读器”功能的场景图的全局视图。此外,它还支持放大功能,方便视觉障碍用户观看。

诊断

smooth 提供诊断接口来帮助开发者调试其模型并测量性能。

截取屏幕

“Scape”支持单个屏幕截图,也支持持续截取屏幕。

Scene Graph API

View 会实现各种 FIDL 协议来履行上述职责。由于场景图发挥着核心作用,因此用于操控场景图的 API 是最重要的 API。

双场景图 API?!?为什么?

当前的情况非常复杂,因为出于历史原因,Sense 支持两种不同的场景图:已废弃的 Gfx API 和“可满足未来需求”的 Flatland API。

景观图支持一次实例化一个场景图:可以有一个 Gfx 场景图或 Flatland 场景图,但不能同时存在这两者。

未来场景图 API

未来,可能还会有其他 API 用于处理场景图。不同之处在于,这些 Futures API 在设计时将与 Flatland API 完美组合,而不是每个 API 引用与其他不兼容的不同类型的场景图。例如,视觉效果 API 在 Flatland 场景图的子树中应用模糊效果。

风景与紫红

“ Fuchsia 风景区”示意图

View 的 API 允许任何客户端将其界面插入到全局场景图中。使用 Flutter 界面框架的进程就是这样一个示例;Flutter 的较低层(称为 Flutter Engine)包含负责与 Views 通信的代码。

Views 有几个内部子系统。FlatlandGfx 拥有场景图并负责渲染。输入负责将输入事件路由到客户端,这还包括协调客户端之间的手势识别,以及管理焦点。

Scene Manager 是一项负责呈现系统界面的独立服务;使用 Insights API,它会创建 View 场景图的根、嵌入窗口管理器的界面,并使用其 Input Pipeline 库读取输入事件,并不断将它们转发到 Sense。

“Scape”是 Vulkan 图形驱动程序和系统显示驱动程序的客户端。

会话

View 的两种合成协议(Flatland 和 Gfx)具有一些共同点,本文将对此进行讨论;如需了解与其中之一相关的详细信息,请参阅相应的链接页面。

在这两种情况下,“会话”是指客户端用于实现以下目标的 FIDL 渠道: - 通过与其他会话建立链接(通过相互协议)参与查看树。 - 提供可由父组件嵌入的视图;反之,嵌入由其他组件通过其自己的会话提供的子视图 - 指定将链接到全局场景图的视觉内容,包括: - 图像 - 空间转换 - 视觉效果(例如模糊)或“群组不透明度” - 将呈现与显示屏帧速率 API 同步至流畅的 Vulkan 和 Vulkan 与 Vulkan 的高效显示事件时,允许其他组件与 Vulkan 进行通知。

会话提供与全局场景图的“保留模式”连接。例如,如果某个组件处于静止状态,Sense 会继续显示其最近提供的帧。

在一个会话被销毁时,它与其他会话中子视图和父视图的关联会断开,Scechive 会释放与该会话关联的所有内存和其他资源。