RFC-0094:Carnelian Virtcon | |
---|---|
状态 | 已接受 |
区域 |
|
说明 | 将 Virtcon 从 C++ 程序转换为基于 Rust 的 Carnelian 应用。 |
问题 | |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 2021-04-21 |
审核日期(年-月-日) | 2021-05-04 |
摘要
本文档提出了一项计划,旨在将虚拟控制台 (Virtcon) 从使用自定义低级图形库 (请参阅 gfx) 的 C++ 程序转换为基于 Rust 的 Carnelian 应用。在此过程中,用于 Workstation 和 Terminal 产品的终端应用代码将与 Virtcon 合并,Virtcon 将能够使用高质量抗锯齿的先进矢量图形和可伸缩文本。
设计初衷
降低复杂性和代码量
Fuchsia 目前维护着两个终端实现:
- Virtcon。
- 适用于 Workstation 产品的终端应用。
Virtcon 实现了自己的有限软件渲染库,而终端应用由 Carnelian 的高级矢量图形渲染后端提供支持。这些实现之间存在大量代码重复,减少这些重复代码对平台来说是利大于弊。Virtcon 目前使用的旧版图形库 (gfx) 可以删除,并且在完成此过渡后,我们可以减少与显示控制器 API 交互的方式数量。
新功能
基于 Carnelian 的 Virtcon 将继续支持无闪烁的单缓冲区模式渲染,同时在具有足够显示驱动程序支持的设备上引入对无画面撕裂的双缓冲区输出的支持。这可以改善视觉效果,并使其与单个缓冲区模式不受支持的某些硬件(例如 FEMU)更好地集成。
可伸缩文本
由于 Carnelian 支持高效渲染可伸缩矢量图形(包括文本),因此可以轻松调整控制台文本的大小,使其与显示屏的密度相匹配。
启动画面
改用 Carnelian 将使 Virtcon 实现现代化,并启用启动画面功能,现有和未来的产品将受益于此。例如,可以在启动期间显示动画,并隐藏debuglog,除非用户按下特殊键或发生错误。Carnelian 对 rive 动画的支持提供了一种无缝的方式来设计和集成界面资源,同时保持较低的资源使用量和高效的渲染。
设计
Virtcon 用于启动,因此必须确保它能够继续用于此用例。我们不接受任何会妨碍此操作的设计更改。
Carnelian 允许应用在没有 Scenic 或 Root Presenter 的情况下运行,并在 Vulkan 不可用的情况下提供高效的软件渲染程序。恢复界面已在使用此 API,并且允许基于 Carnelian 的应用替换 Virtcon 所需的额外步骤也已完成。在没有 Scenic 的情况下运行的 Carnelian 应用会与显示屏和输入驱动程序直接通信,方式与旧版 Virtcon 类似。
基于 Carnelian 的 Virtcon 将旨在最大限度地利用终端应用重复使用代码。
Fuchsia 开发者应该不会注意到这次转换有明显差异。用于与 Virtcon 交互的硬件要求和 FIDL API 不会发生变化。
实现
基于 Carnelian 的 Virtcon 将类似于恢复界面应用,但会以 Virtcon 客户端(而非 Primary 客户端)的身份连接到显示屏控制器(如需详细了解差异,请参阅 display-coordinator API)。
通过将所有共享逻辑实现为这两个组件都可以使用的 Rust 库,可以最大限度地实现与终端应用的代码重用。在某些情况下,这意味着将终端代码提取到库中。
我们将开发一个基于 Carnelian 的文本网格,为终端应用和 Virtcon 提供支持。此文本网格将利用 Carnelian 对部分屏幕更新的支持,提供与旧版 Virtcon 相当的性能。
性能
性能和资源使用情况是该项目的关键方面。在进行此过渡时,性能和内存用量不得出现明显下降,这一点至关重要。双缓冲预计会增加内存用量,但该功能应为可选功能。
在以下方面,两组不应存在显著差异:
- CPU 使用率。
- 内存用量。
- 构建时间。
Virtcon 的二进制文件大小预计会增大,但应保持在 1 MiB 以下。
测试
Virtcon 的测试覆盖率应保持不变或有所提高。所有新的 Rust 代码都应进行单元测试,现有的集成测试应转换为新版 Virtcon。
文档
在此阶段,我们计划通过此 RFC 和此 README.md 文档记录基于 Carnelian 的 Virtcon。