用戶端要求一組指令,做為日後的優美影格的一部分。一個 Views 頁框可包含多個用戶端「呈現」,其中每個 代表代表工作階段的全域場景圖表更新。本文件說明 Views 的內部架構,說明要求成為像素的方式。
下圖顯示用戶端簡報要求時應執行的步驟。風景 FIDL 邊界與 Vulkan 驅動程式庫之間的所有作業目前皆採用單一執行緒,並依序執行。
- 用戶端
Enqueue()
會使用一組指令來變更場景的一部分內容,並呼叫Present2()
來提交這些片段。 Present2()
要求會進入scenic_impl::Session
,scenic_impl::Session
會等待任何取得的柵欄收到信號,以及尚未觸及柵欄的任何Present2()
呼叫。scenic_impl::Session
接著會使用FrameScheduler
為指定的presentation_time
安排更新。FrameScheduler
會進入休眠狀態,直到有足夠時間針對指定的簡報時間準備影格。此時,FrameScheduler
會喚醒,並在所有SessionUpdaters
上呼叫SessionUpdater::UpdateSessions()
。- 針對每個用戶端工作階段,
GfxSystem
會呼叫ApplyScheduledUpdates()
,這會將指令套用至步驟 1 中已排入佇列的場景。注意:GfxSystem
是SessionUpdater
。 - 來自工作階段的指令會套用至全域場景圖。情境圖目前處於不一致的狀態 (「骯髒」),在處理完場景圖後,不應讀取其他系統 (例如輸入) 的資料。
- 所有
SessionUpdaters
成功更新後,FrameScheduler
會通知場景圖有髒汙,並在FrameRenderer
上觸發RenderFrame()
呼叫。 - 如要繪製影格,
gfx::Engine
的轉譯器會掃遍場景圖,並為情境中的每個元素建立Escher::objects
。接著,轉譯器會將這些物件傳送至Escher
,並呼叫DrawFrame()
。注意:gfx::Engine
是FrameRenderer
。 Escher
會將場景圖物件解讀為vk::commands
,並將這些指令傳送至 GPU。- GPU 會處理指令,並將結果傳送給螢幕驅動程式庫。
- 顯示驅動程式庫會將像素推送至螢幕。