平地

Flatland 是風景的 2D 構成 API。Flatland 提供 Fuchsia 圖形用戶端的功能,方便他們建構場景圖並提交至風景。接著,風景會將這些圖像組合為顯示在螢幕上的單元圖。

  • 適用於緩衝區內容的 2D API
  • 保留模式
  • 全球場景圖,內容分佈於各元件
  • 注重效率和掌控度

背景

風景優美的圖形用戶端,具有 fuchsia.ui.gfx 命名空間 (「Gfx API」) 下的 3D API。但 Fuchsia 目前的客戶基本上是 2D 產品。這會導致場景的 3D 場景呈現方式與使用者看到的 2D 呈現不相符。無論是從產品看法或效能的角度,Fuchsia 決定 Gfx API 都不再適用於 View 上的需求。如要進一步瞭解這項決策,請參閱「Flatland 藍圖項目」。Fuchsia 的所有圖形用戶端都已遷移至 Flatland API。

設計

Flatland 旨在提供專為 2D 矩形圖層最佳化的輕量組成 API。

扁平用戶端建立內容是位於 X/Y 的矩形圖層。他們提交內容,目標是在日後的 vsync 中取得螢幕。每個 Flatland 用戶端的內容都會單獨提交給 View。

風景的系統合成器會處理這些場景圖,產生整合的場景圖。風景可能會將這些圖形圖層直接傳遞至顯示畫面。如果不行,Canvas 可能會使用 Vulkan 將這些圖像內容算繪至提交至螢幕的單一圖層。

平地流動

以下是針對 Flatland API 所做的整體設計決策:

  • Flatland API 使用的結構方式是將伺服器排入佇列的指令,接著是修訂呼叫 (Present())。如果是 GFX 版本,系統不會提供指令聯集模式或用戶端排入佇列。
  • 平地是有狀態的。用戶端可以在 Present() 呼叫之間對場景圖表做出遞增變更。
  • Flatland 旨在盡可能將組合工作委派給影片顯示控制器 (VDC) 硬體。這麼做可以降低風景的 GPU 使用率,並讓系統的其餘部分可以使用 HW。Flatland 會密切遵循,並提供類似 VDC 的功能,後者是以嚴格 2D 模式運作。
  • Flatland 旨在為客戶提供明確的 CPU 成本。只有一個排定期限的轉譯執行緒。每個 Flatland 工作階段都會在自己的調度工具中執行,因此不會影響彼此的提交內容。
  • 系統會透過 fuchsia.ui.composition/Allocator 中定義的景觀分配器通訊協定強制執行圖片配置。轉移圖片資源時,系統不會複製任何圖片。

通訊協定

平地

建立及提交 2D 場景圖的主要通訊協定。連結 Flatland 通訊協定不代表提交的內容可以顯示在螢幕中。Flatland 執行個體仍應透過建立自己的檢視畫面來連線至全域 View Tree

ViewBound 通訊協定

在這個 Flatland 執行個體中建立的 View 上運作的輸入通訊協定。

ParentViewportWatcher

向子項 Flatland 執行個體提供父項 Flatland 執行個體相關資訊的通訊協定。

ChildViewWatcher

向父項 Flatland 執行個體提供子項 Flatland 執行個體相關資訊的通訊協定。