Pixel 的壽命

用戶端會要求一組指令,做為未來未來相框中的顯示。單一視覺框架可擁有多個用戶端「存在」,而每個呈現方式都代表 Flatland 執行個體對全球場景圖的更新。本文件將說明在《觀察》中,要求如何成為像素的架構。

下圖說明用戶端要求在提出要求時採取的步驟。Flatland 是多執行緒系統,且除了會處理合成的中央轉譯執行緒外,還有 Flatland 執行個體各自儲存在執行緒中。

扁平像素中的一生

  1. 用戶端會對 Flatland API 發出各種呼叫,以修改其場景圖、建立轉換與矩形,以及新增圖片。用戶端建立映像檔時,會註冊多個 BufferCollectionImporter API 實作項目,包括 Vulkan 和顯示控制器實作項目。每個映像檔都會建立映像檔的內部內部表示法,以用於 sysmem 支援的網域 (例如 Vulkan 的 Vulkan 映像檔),這在之後成為重要,請參閱步驟 8)。準備就緒後,用戶端會呼叫 Present() 進行修訂。

  2. FrameScheduler 會決定何時套用 Present() 呼叫。並使用自身內部政策提前喚醒,以在下次 vsync 之前顯示影格。

  3. 每個 Flatland 執行個體都與其專屬的 UberStruct 相關聯,即特定 Flatland 執行個體的本機資料集合,代表該執行個體呈現狀態的最新修訂版本。UberStruct 代表 Flatland 執行個體的本機狀態快照。因此,其僅包含資料,沒有外部資源參照。呼叫 Present() 後,扁平執行個體的 UberStruct 會在這個時間更新。

  4. 接下來,UberStructSystem 需要編譯 UberStruct 資料。UberStructSystem 是所有 uberstruct 的中央管理工具,是將 Flatland 執行個體中的本機資料 (uberstructs) 匯總為整個場景圖的快照,以供轉譯迴圈使用。更明確地說,UberStructSystem 會擷取所有已取得信號的圍欄的 Uberstruct 快照。其意圖是讓個別工作站執行緒擁有每個 Flatland 執行個體、在本機執行緒中計算本機資料 (例如拓撲向量),然後以並行的方式將這些向量提交至 UberStructSystem

  5. 此處的 UberStructSystem 資料會傳送至 Engine,藉此將多個 Flatland 執行個體中的資料拉長成適合進行低階圖形顯示和顯示處理的長型 1 維陣列。此外,我們也在引擎進行矩形可轉譯資料的遮蔽。

  6. 此時,轉譯程序可分為兩種可能的選項。 Flatland 可執行直接顯示合成和 Vulkan 式 GPU 合成。DisplayCompositor 負責管理這兩個轉譯路徑,並選擇要用於某個影格的轉譯資料組合。我們建議採用直接顯示畫面的顯示路徑,因為它可將內容直接繫結至裝置硬體層,無須進行昂貴的算繪運算。但是,圖層數量有限 (視特定裝置而異),以及裝置套用圖片適用的特定規則。只要符合相關條件,就會直接跳到步驟 7。否則,我們會進行步驟 8。

  7. 在直接顯示組合期間,DisplayCompositor 會取得 RectangleRenderable 資料,並將各個矩形分解為 sourcedest 資料,以套用將套用該圖層的圖層。Source 資料是指要繪製圖片的紋素中的裁剪尺寸。Dest 資料是指圖片在螢幕空間中的像素像素尺寸。同時,我們也試著在這裡直接顯示色彩轉換。

  8. 如果無法直接進行顯示直接組合,就會改用 GPU 合成。轉譯資料會從 DisplayCompositor 傳送至 VkRenderer。這裡列出的任何步驟之前,當用戶端在 Flatland 執行個體中設定圖片時,系統會使用 VkRenderer (步驟 1) 註冊這些映像檔,其針對 sysmem 支援的映像檔建立 Vulkan 紋理。進入這個步驟後,建立 Vulkan 紋理的作業就已完成。也就是說,所有 VkRenderer::Render() 函式都必須將轉譯資料傳送至 RectangleCompositor (下方步驟 9) 之前建立新的 Escher 頁框,透過轉換圖片版面配置並計算其適當的正規化 UV 座標,以及設定轉譯完成時,向信號發出 Vulkan 協議,以準備要轉譯的紋理。

  9. 資料會從 VkRenderer 向下傳遞至 RectangleCompositorRectangleCompositor 是一般的 2D Vulkan 合成器,利用 Escher 將圖片資料陣列轉譯成輸出圖像 (framebuffer)。為提高運作效率,系統會分開處理不透明和透明的資料。不透明資料會前後往前後公開,且 Vulkan CommandBuffers 會隨處更新,而其他資料則需要進行轉譯,例如推送常數。

  10. 當所有指令都被推送至 Vulkan 指令緩衝區後,我們進入 GPU 等級,由則扁平專屬頂點和片段著色器正在處理轉譯資料。此外,如果在嘗試直接顯示多媒體廣告時未成功套用色彩轉換,系統也會在這裡叫用 Flatland 色彩轉換著色器,並直接計算色彩校正值,做為主要算繪通道之後的子通道。

  11. 所有資料都套用至顯示控制器設定後,我們會呼叫 ApplyConfig 來修訂變更。完成後,所有轉譯的資料都會顯示在螢幕上。