Pixel 的壽命

用戶端要求一組指令,做為日後的優美影格的一部分。一個 Views 頁框可包含多個用戶端「呈現」,其中每個 代表代表工作階段的全域場景圖表更新。本文件說明 Views 的內部架構,說明要求成為像素的方式。

下圖顯示用戶端簡報要求時應執行的步驟。風景 FIDL 邊界與 Vulkan 驅動程式庫之間的所有作業目前皆採用單一執行緒,並依序執行。

  1. 用戶端 Enqueue() 會使用一組指令來變更場景的一部分內容,並呼叫 Present2() 來提交這些片段。
  2. Present2() 要求會進入 scenic_impl::Sessionscenic_impl::Session 會等待任何取得的柵欄收到信號,以及尚未觸及柵欄的任何 Present2() 呼叫。scenic_impl::Session 接著會使用 FrameScheduler 為指定的 presentation_time 安排更新。
  3. FrameScheduler 會進入休眠狀態,直到有足夠時間針對指定的簡報時間準備影格。此時,FrameScheduler 會喚醒,並在所有 SessionUpdaters 上呼叫 SessionUpdater::UpdateSessions()
  4. 針對每個用戶端工作階段,GfxSystem會呼叫 ApplyScheduledUpdates(),這會將指令套用至步驟 1 中已排入佇列的場景。注意:GfxSystemSessionUpdater
  5. 來自工作階段的指令會套用至全域場景圖。情境圖目前處於不一致的狀態 (「骯髒」),在處理完場景圖後,不應讀取其他系統 (例如輸入) 的資料。
  6. 所有 SessionUpdaters 成功更新後,FrameScheduler 會通知場景圖有髒汙,並在 FrameRenderer 上觸發 RenderFrame() 呼叫。
  7. 如要繪製影格,gfx::Engine 的轉譯器會掃遍場景圖,並為情境中的每個元素建立 Escher::objects。接著,轉譯器會將這些物件傳送至 Escher,並呼叫 DrawFrame()。注意:gfx::EngineFrameRenderer
  8. Escher 會將場景圖物件解讀為 vk::commands,並將這些指令傳送至 GPU。
  9. GPU 會處理指令,並將結果傳送給螢幕驅動程式庫。
  10. 顯示驅動程式庫會將像素推送至螢幕。

類別的圖片,並呼叫用戶端簡報要求,進入畫面上的像素。這是上方列舉清單的示意圖。