風景優美的 Fuchsia 系統合成器

說明

View 是一項系統服務,主要負責管理全球場景圖,由平台上所有應用程式與 SysUI 共用。這個場景圖可以說明應用程式如何顯示螢幕上的內容、接收使用者輸入事件的方式,同時也支援其他 Fuchsia 系統元件的功能。這是客戶之間幾何/生物關係的「可靠來源」。

景色的責任

構圖

Display & Video 360 為用戶端 (應用程式、SysUI) 提供 API,用來操控 View 中全域場景圖的子圖表。在這個子圖表中,使用者可以附加圖形內容,以及嵌入其他元件提供的 View。這種嵌入採用遞迴方式:元件連結至父項,與連結至其子項元件的方式相同。

轉譯/顯示

為了提高效率,View 可以直接向顯示控制器呈現用戶端圖片,而不必啟動 GPU!然而,基於各種原因,並非萬無一失。「風景」會動態決定每個影格,能否直接顯示用戶端提供的圖片,或是否需要與 GPU 組合。

視覺效果

Display & Video 360 的視覺效果是用戶端無法內建在內容中,例如 View 的 (已淘汰) GFX API 可讓用戶端在 3D 場景中插入內容,如此一來,不同應用程式中的物件就能產生陰影並反射光線。同樣地,Flatland 旨在支援「群組不透明度」等效果。

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

多媒體廣告活動管理

Fuchsia 的顯示控制器 API 僅限連接一個已連結的用戶端。由於 Senic 必須顯示所有影格的內容,而且延遲時間較短,因此 SceN 應與顯示控制器之間的唯一連線,才能解決問題。然而,這表示對於需要與顯示控制器互動的任何其他方,皆必須做為 Proxy。舉例來說,SysUI 必須讓使用者執行下列操作: - 查看已連接的螢幕 - 選擇每個螢幕的解析度和刷新率 - 在虛擬桌面上排列螢幕的相對位置

影格排程

風景、用戶端和顯示控制器都必須全部合作排程畫面,以盡可能縮短延遲時間、記憶體用量等。View 的支援方式如下: - 在可以重複使用共用資源時通知共用資源 (例如當用戶端可以安全轉譯到先前使用的緩衝區,以便向先前使用的緩衝區進行內容顯示時) - 向用戶端顯示內容,以便向下一個 vsync 控制器顯示內容,以便讓影格在下一個 Atom 圖表上顯示內容。

影格排程可進一步探索這個主題。

輸入

應用程式在場景圖中的位置會影響輸入事件 (例如滑鼠觸控事件) 的轉送方式。例如:用戶端會在檢視畫面的座標系統中傳送輸入事件;風景會將輸入管道中的傳入事件轉換為適當的座標系統。- 場景圖拓撲中的位置至關重要:如果檢視區塊「位於另一個位置」的檢視區塊具有優先存取權,就可以接收該事件。例如「輕觸並拖曳」等持續進行手勢會將所有手勢事件傳送至同一個目標檢視畫面,即便使用者的手指在目標檢視畫面的邊界外移動也一樣。

無障礙功能

View 提供的功能是由無障礙管理工具用於實作多項功能。舉例來說,ViewModel 提供支援「螢幕閱讀器」功能的全球場景圖檢視畫面。還支援放大功能,讓視覺障礙的使用者能夠享受放大功能。

診斷

View 提供診斷介面,可協助開發人員對模型進行偵錯及評估成效。

擷取螢幕畫面

Display & Video 360 支援個別螢幕截圖,以及持續擷取的螢幕畫面。

場景圖 API

View 會實作各種 FIDL 通訊協定來履行上述責任。由於情境圖扮演的主要角色,用於操控場景圖的 API 是最重要的 API。

透過兩個場景圖 API ?原因是什麼?

目前情況較為複雜,因為就歷史因素,View 支援兩種不同的場景圖「種類」、已淘汰的 Gfx API,以及較「具前瞻性的」Flatland API。

風景可以一次將一個場景圖執行個體化:可以提供 Gfx 場景圖或平地場景圖,但不能同時兩者。

未來場景圖 API

日後可能會有其他 API 會操控場景圖。差別在於,每個 API 都會參照其他類型的場景圖,而這些類型與其他場景圖不相容,而這些未來的 API 將是設計為可與 Flatland API 完美組合一起組合。例如,在 Flatland 場景圖的子樹狀結構中套用模糊效果,這個視覺效果 API 可以套用模糊效果。

風景與紫紅色

福奇亞風景圖

透過景觀的 API,所有用戶端都能將其 UI 插入至全域場景圖。使用 Flutter UI 架構的程序只是一個範例;Flutter 的下一層稱為 Flutter Engine,其中包含負責與 View 通訊的程式碼。

風景區有數個內部子系統。FlatlandGfx 其中之一有場景圖且負責轉譯。「輸入」負責將輸入事件轉送給用戶端,這也涉及在用戶端協調手勢辨識,以及管理焦點。

「Scene Manager」是一個獨立服務,負責「呈現」系統 UI;使用景觀 API 時,系統會建立風景場景圖表的根層級、嵌入視窗管理員的 UI,以及使用其 Input Pipeline 程式庫讀取輸入事件,並持續將這些事件轉送至風景。

View 是 Vulkan 圖形驅動程式的用戶端,也是系統顯示驅動程式的用戶端。

工作階段

View 的兩種組合通訊協定 (Flatland 和 Gfx 有本文討論),詳情請參閱連結頁面。

在這兩種情況下,「工作階段」都是指用戶端用來達成下列目標的 FIDL 管道: - 請透過其他工作階段提供連結,藉此參與 View Tree。- 提供可由父項元件嵌入的檢視畫面 - 相反地,透過自身的工作階段嵌入其他元件提供的子項檢視畫面 - 指定會連結到全域場景圖的視覺內容,包括: - 圖片 - 空間轉換 - 視覺效果 (例如模糊或「群組風景信號」 - 由 Vulkan 畫面工作階段呈現模糊或「群組不透明度」信號,與其他元件的顯示畫面更新率保持同步。

工作階段可以提供與全球場景圖的「保留模式」連結。舉例來說,如果元件是等距,則景觀區會持續顯示該元件最近提供的影格。

刪除工作階段時,工作階段在其他工作階段中有子項和父項檢視畫面的連結會損毀,且景觀會釋出與該工作階段相關聯的所有記憶體和其他資源。