風景優美的 Fuchsia 系統合成器

簡介

Scenic 是系統服務,主要負責管理全域場景圖表,並與平台上的所有應用程式共用,以及 SysUI。此場景圖表會調解應用程式在螢幕上顯示內容的方式、接收使用者輸入事件的方式,並支援其他 Fuchsia 系統元件的功能。這是用戶端之間幾何/拓樸關係的「可靠來源」。

Scenic 的責任

樂曲

Scenic 為用戶端 (應用程式、SysUI) 提供 API,用於操作全域場景圖的子圖,該圖的根目錄為 View。在這個子圖中,他們可以附加圖形內容,並嵌入其他元件提供的檢視畫面。這項嵌入作業是遞迴的:元件連結至父項的方式,與連結至子項元件相同。

(注意:「父項」和「子項」是指場景圖形拓樸中的相對位置,可能與

算繪/顯示

為了提高效率,Scenic 可以直接將用戶端圖片呈現給顯示器控制器,不必啟動 GPU!不過,基於各種原因,這並非總是可行的。Scenic 會動態決定每個影格是否可直接顯示由用戶端提供的圖片,或是必須與 GPU 合成。

視覺效果

Scenic 負責處理無法嵌入用戶端提供內容的視覺效果。舉例來說,Scenic 的 (已淘汰) GFX API 可讓用戶端將內容插入 3D 場景,讓不同應用程式的物件投射陰影,並相互反射光線。同樣地,Flatland 也支援「群組不透明度」等效果。

目前這類效果的清單有限,但日後會增加。

顯示管理

Fuchsia 的螢幕控制器 API 僅限於單一已連線的用戶端。由於 Scenic 需要以低延遲的速度在每個影格中顯示內容,因此 Scenic 應與顯示器控制器建立唯一連線。不過,這也意味著 Scenic 必須為需要與螢幕控制器互動的任何其他方擔任 Proxy。舉例來說,SysUI 必須讓使用者能夠: - 查看哪些螢幕已連線 - 選擇每個螢幕的解析度和更新率 - 在虛擬桌面上安排螢幕的相對位置

影格排程

Scenic、用戶端和顯示控制器都必須合作排程影格,以便盡可能減少延遲、記憶體使用量等。Scenic 會透過以下方式支援這項作業:- 在可重複使用的共用資源可重複使用時發出通知 (例如,當用戶端可安全地將轉譯結果轉換為先前使用的緩衝區時)- 傳達用戶端的截止期限,以便在下一個 vsync 顯示內容- 提早喚醒,以便執行顯示影格的作業,包括:- 以原子方式更新場景圖- 視需要使用 Vulkan 轉譯- 告知顯示控制器要顯示哪些圖片

影格排程會進一步探討這個主題。

輸入

應用程式在場景圖表中的順序會影響輸入事件 (例如滑鼠觸控事件) 的導向方式。舉例來說: - 用戶端會以其檢視畫面的座標系統傳送輸入事件;Scenic 會將輸入管道的內部事件轉換為適當的座標系統。- 場景圖形結構拓樸中的順序很重要:位於其他檢視畫面「頂端」的檢視畫面,會優先接收該事件。- 持續性手勢 (例如「輕觸並拖曳」) 會將所有手勢事件傳送至相同的目標檢視畫面,即使使用者的手指移動到目標檢視畫面的邊界外也一樣。

無障礙設定

Scenic 提供的功能可供 Accessibility Manager 用來實作各種功能。舉例來說,Scenic 會公開支援「螢幕閱讀器」功能的場景圖表全域檢視畫面。並支援視障人士使用的放大功能。

診斷

Scenic 提供診斷介面,協助開發人員偵錯模型及評估效能。

擷取螢幕畫面

Scenic 支援個別螢幕截圖,以及持續的螢幕擷取。

場景圖表 API

Scenic 會實作各種 FIDL 通訊協定,以履行上述職責。由於場景圖的角色是核心,因此用於操控場景圖的 API 是最關鍵的。

兩個場景圖 API?為什麼?

目前的情況相當複雜,因為基於歷史原因,Scenic 支援兩種不同的類型場景圖表,即已淘汰的 Gfx API 和更「未來可行」的 Flatland API。

Scenic 一次只能例項化一個場景圖:可以是 Gfx 場景圖或 Flatland 場景圖,但不能同時是兩者。

日後的場景圖 API

日後,我們可能會推出其他用於操控場景圖表的 API。差異在於,這些未來 API 將設計成可與 Flatland API 完美搭配,而非各自參照不同類型的場景圖表,且彼此不相容。例如,視覺特效 API 可套用模糊效果,將 Flatland 場景圖表的子樹納入其中。

Scenic 和 Fuchsia

Fuchsia 中 Scenic 的圖表

Scenic 的 API 可讓任何用戶端將其 UI 插入全域場景圖表。使用 Flutter UI 架構的程序就是其中一個例子;Flutter 的較低層級稱為 Flutter Engine,其中包含負責與 Scenic 通訊的程式碼。

Scenic 有幾個內部子系統。FlatlandGfx 會擁有場景圖表,並負責算繪。Input 負責將輸入事件轉送至用戶端,這也包括協調跨用戶端的手勢辨識,以及管理焦點。

Scene Manager 是負責呈現系統 UI 的獨立服務;它會使用 Scenic API 建立 Scenic 場景圖表的根目錄、嵌入視窗管理員的 UI,並使用其 Input Pipeline 程式庫讀取輸入事件,並持續將這些事件轉送至 Scenic。

Scenic 是 Vulkan 圖像驅動程式和系統顯示器驅動程式的用戶端。

工作階段

Scenic 的兩個合成通訊協定 (Flatland 和 Gfx) 有共同點,這裡會討論這些共同點;請參閱連結的頁面,瞭解與其中一個或另一個相關的詳細資料。

在兩種情況下,「工作階段」都指的是用戶端用來達成以下目標的 FIDL 管道: - 與其他工作階段建立連結 (雙方同意),參與檢視樹狀結構。- 提供可由父項元件嵌入的檢視畫面 - 反之,透過各自的工作階段,嵌入其他元件提供的子項檢視畫面 - 指定將連結至全域場景圖表的視覺內容,包括: - 圖片 - 空間轉換 - 視覺效果,例如模糊處理或「群組不透明度」 - 將呈現內容與顯示影格速率同步,以及與其他元件的工作階段同步 - 當 Scenic 的事件通知客戶可呈現另一個影格時,即可通知客戶 - 柵欄可讓您有效地向 Vulkan 等 API 傳送/接收信號

工作階段會提供「保留模式」連線,連線至全域場景圖表。舉例來說,如果元件處於靜止狀態,Scenic 會繼續顯示該元件最近提供的影格。

當工作階段遭到銷毀時,其與其他工作階段中子檢視區塊和父檢視區塊的連結會中斷,Scenic 也會釋出與工作階段相關聯的所有記憶體和其他資源。