用戶端要求一組指令,做為日後的優美影格的一部分。一個 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 會處理指令,並將結果傳送給螢幕驅動程式庫。
- 顯示驅動程式庫會將像素推送至螢幕。