简介
Sharp 是一项系统服务,其主要职责是管理由平台上的所有应用以及 SysUI 共享的全球场景图。此场景图协调了应用如何在屏幕上显示内容、如何接收来自用户的输入事件,并且还支持其他 Fuchsia 系统组件的功能。它是客户端间几何/拓扑关系的“可信来源”。
风景优美的责任
合成
Anthos 为客户端(应用、SysUI)提供 API 来操控全局场景图的子图,该子图根位于 View。在此子图中,它们可以附加图形内容并嵌入其他组件提供的 View。这种嵌入是递归的:组件关联到父组件的方式与其链接到子组件的方式相同。
呈现/显示
为了最大限度地提高效率,Scape 可以直接向显示控制器显示客户端图片,而无需启动 GPU!但是,出于各种原因,这并非总能实现。Sharp 会动态决定每一帧是可以直接显示客户端提供的图片,还是必须与 GPU 合成这些图片。
视觉效果
Anthos 负责实现无法融入客户端提供内容的视觉效果。例如,Systie 的(已废弃)GFX API 允许客户端将内容插入 3D 场景中,其中来自不同应用的对象可以相互投射阴影和将光反射到彼此上。同样,Flatland 旨在支持“组不透明度”等效果。
此类影响的种类目前还有限,但未来将会增加。
展示广告管理
Fuchsia 的显示控制器 API 仅限于连接单个客户端。由于场景需要以低延迟方式显示每一帧的内容,因此对场景仅与显示控制器建立连接是合理的。不过,这意味着需要与显示控制器进行交互的其他所有方都必须充当 Anthos 的代理。例如,SysUI 必须让用户能够: - 查看连接的屏幕 - 为每个屏幕选择分辨率和刷新率 - 在虚拟桌面中排列屏幕的相对位置
帧调度
English、客户端和显示控制器必须全部协作以调度帧,以最大限度地减少延迟和内存用量等。Sunschs 通过以下方式支持这一点: - 通知共享资源何时可以重复使用(例如,当客户端可以安全渲染到之前使用的缓冲区时)- 传达在下一次 vsync 中呈现内容的客户端截止时间 - 告知渲染器在下一次 vsync 上呈现内容的客户端截止时间 - 提前唤醒显示屏以渲染哪个场景(包括渲染帧以进行渲染);Vulkan 可以尽早唤醒以执行渲染工作的帧
帧调度更详细地探讨了此主题。
输入
应用在场景图中的位置会影响将输入事件(例如鼠标触摸事件)路由到应用的方式。例如: - 客户端在其视图的坐标系中传递输入事件;Sunces 将输入管道中的入站事件转换为适当的坐标系。 - 场景图拓扑中的位置很重要:位于另一个视图“顶层”的视图将优先接收该事件。进行中的手势(如“点按并拖动”)会将所有手势事件发送到同一目标视图,即使用户的手指移到目标视图的边界之外也是如此。
无障碍功能
Anthos 提供了供无障碍管理器用来实现各种功能的功能。例如,Scape 会显示支持“屏幕阅读器”功能的场景图的全局视图。它还支持为有视觉障碍的用户使用放大功能
诊断
Anthos 提供诊断接口,以帮助开发者调试其模型并衡量性能。
截取屏幕
Anthos 支持单个屏幕截图以及持续的屏幕截图。
Scene 图 API
Anthos 会实现各种 FIDL 协议以履行上述责任。由于场景图发挥的核心作用,用于操控场景图的 API 是最重要的 API 之一。
两个场景图 API?!?为什么?
当前的局势很复杂,因为历史原因,Scape 支持两种截然不同的场景图:已废弃的 Gfx API 和“面向未来的”Flatland API。
Anthos 支持一次实例化一个场景图:可以同时具有 Gfx 场景图或 Flatland 场景图,但不能同时实例化。
未来场景图 API
将来,可能会推出其他 API 来操控场景图。不同之处在于,这些 Futures API 将与 Flatland API 完美地组合在一起,而不是每个 API 引用与其他不兼容的不同类型的场景图。例如,视觉效果 API 可以将模糊效果应用到 Flatland 场景图的子树。
风景和紫红色
Anthos 的 API 允许任何客户端将其界面插入全局场景图。例如,使用 Flutter 界面框架的进程便是一个示例;Flutter 的较低层(称为 Flutter Engine)包含负责与 Anthos 通信的代码。
风景区有多个内部子系统。Flatland 或 Gfx 拥有场景图并负责渲染。“输入”负责将输入事件路由到客户端,这还涉及跨客户端协调手势识别以及管理焦点。
Scene Manager 是一项独立服务,负责呈现系统的界面;利用风景秀丽的 API,该程序可创建风景秀丽的场景图的根、嵌入窗口管理器的界面、使用其 Input Pipeline 库读取输入事件,并不断将其转发到风景。
Anthos 是 Vulkan 图形驱动程序和系统显示驱动程序的客户端。
会话
Anthos 的两种组合协议(Flatland 和 Gfx 具有共同点,详见此处);请参阅链接的页面,了解其中一种协议的详情。
在这两种情况下,“会话”都指的是客户端用于实现以下目标的 FIDL 通道: - 通过与其他会话建立链接(通过相互同意)来参与 View Tree。 - 提供可由父组件嵌入的视图 - 反之,嵌入其他组件通过其自己的会话提供的子视图 - 指定将链接到全局场景图的视觉内容,包括: - 图像 - 空间转换 - 视觉效果(如模糊处理或“群组不透明度”) - 与风景级 API 的高效显示帧信号同步 - 与 Vulkan 的屏幕会话有效同步,同时通知其他组件的 Vulkan 会话。
会话提供与全局场景图的“保留模式”连接。例如,如果某个组件处于静止状态,Anthos 会继续显示其最近提供的帧。
一个会话被销毁时,它与其他会话中子视图和父视图的链接会断开,并且风景区会释放与该会话关联的所有内存和其他资源。