| 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 實作了專屬的受限軟體算繪程式庫,而 Terminal 應用程式則採用 Carnelian 的進階向量圖形算繪後端。這些實作項目之間有大量重複的程式碼,減少重複程式碼對平台來說是淨正面影響。Virtcon 目前使用的舊版 gfx 圖像程式庫可以刪除,完成這項轉換後,我們與螢幕控制器 API 互動的方式也會減少。
新功能
以 Carnelian 為基礎的 Virtcon 會繼續支援無閃爍的單一緩衝區模式算繪,並在顯示驅動程式庫支援充足的裝置上,導入無撕裂的雙緩衝區輸出。這項變更可改善視覺外觀,並與某些硬體 (例如 FEMU) 進行更完善的整合,因為這些硬體不支援單一緩衝區模式。
可縮放文字
Carnelian 支援有效率地算繪可縮放向量圖形 (包括文字),因此調整控制台文字大小以配合螢幕密度非常簡單。
啟動顯示畫面
改用 Carnelian 後,Virtcon 將會採用新式架構,並啟用啟動畫面功能,讓現有和日後推出的產品都能受益。舉例來說,啟動期間可以顯示動畫,除非使用者按下特殊鍵或發生錯誤,否則可以隱藏 debuglog。Carnelian 支援 rive 動畫,可順暢設計及整合 UI 資產,同時維持低資源用量和高效轉譯。
設計
Virtcon 用於啟動,因此必須繼續運作,才能用於這個用途。如果設計變更會導致無法達成上述目標,系統將不接受。
應用程式可透過 Carnelian 執行,不必使用 Scenic 或 Root Presenter,且在無法使用 Vulkan 的情況下,還能透過高效的軟體算繪器執行。復原使用者介面已使用這項功能,且允許 Carnelian 型應用程式取代 Virtcon 的額外步驟也已完成。在沒有 Scenic 的情況下,Carnelian 應用程式會直接與螢幕和輸入驅動程式通訊,方式與舊版 Virtcon 類似。
Carnelian 架構的 Virtcon 將盡可能重複使用程式碼,以搭配終端機應用程式。
Fuchsia 開發人員應該不會感受到這項轉換帶來的重大差異。與 Virtcon 介接的硬體需求和 FIDL API 不會變更。
實作
以 Carnelian 為基礎的 Virtcon 與復原 UI 應用程式類似,但會以 Virtcon 用戶端的形式連線至顯示控制器,而不是以主要用戶端的形式連線 (如要瞭解兩者差異,請參閱 display-coordinator API)。
如要盡量重複使用 Terminal 應用程式的程式碼,請將所有共用邏輯實作為兩個元件都能使用的 Rust 程式庫。在某些情況下,這表示要將終端機程式碼擷取到程式庫中。
我們將開發以 Carnelian 為基礎的文字格線,為終端機應用程式和 Virtcon 提供支援。這個文字格線會利用 Carnelian 支援的部分畫面更新功能,提供與舊版 Virtcon 相符的效能。
效能
效能和資源用量是這個專案的關鍵層面。因此,效能和記憶體用量不會大幅倒退,是這項轉換作業的關鍵。雙重緩衝預期會增加記憶體用量,但這項功能應為選用。
以下指標不應有顯著差異:
- CPU 用量。
- 記憶體用量。
- 建構時間。
Virtcon 的二進位大小預計會增加,但應維持在 1 MiB 以下。
測試
Virtcon 的測試涵蓋範圍應相同或有所提升。所有新的 Rust 程式碼都應有單元測試,且現有的整合測試應轉換為新版 Virtcon。
說明文件
在這個階段,我們計畫透過這份 RFC 和 README.md 文件,記錄以 Carnelian 為基礎的 Virtcon。