在一般影格中,使用 Flatland API 時的事件順序如下所示1:
- 用戶端呼叫
Flatland::Present()
。 - 等待景色到
PresentArgs::requested_presentation_time
且接收到PresentArgs::server_wait_fences
訊號為止。requested_presentation_time
是現在可能顯示在螢幕上的最早時間。server_wait_fences
是一組 Zircon 事件 (「圍欄」),這類事件必須先收到信號,才能顯示透過Present()
呼叫提交的內容。
- 風景會合成所有用戶端的內容,並傳送至這個影格。
- 顯示畫面會將
Flatland::->OnNextFrameBegin()
傳送至用戶端。 - 用戶端開始建立下一個影格。
- 圖片實際顯示後,Lake 會將
Flatland::->OnFramePresented()
傳送至用戶端。 - 從 1 重複以上步驟。
本文件將說明這些信號的意義。
Present()
由於用戶端發出 Flatland API 呼叫,這些作業實際上並未立即套用。而是在呼叫 Present()
時以不可分割的形式修訂這些更新。兩次呼叫 Present()
之間的一組更新,在本文件中稱為 present
。
呼叫 Present()
時,用戶端傳遞引數資料表 PresentArgs
,其中包含 Present()
呼叫應如何處置的引數。決定螢幕顯示時機最重要的引數是 requested_presentation_time
和 server_wait_fences
。
如要進一步瞭解 Present()
呼叫的處理方式,請參閱「影格排程」。
->OnNextFrameBegin()
->OnNextFrameBegin()
會以提示的形式傳送給用戶端,說明何時應開始建立下一個影格。儘管沒有明確指出風景狀態的任何資訊,但景觀區認為資源爭用情形應相對較低。只有在用戶端進行先前的 Present()
呼叫,且用戶端仍有抵免額時,才會傳送 OnNextFrameBegin()
。
->OnFramePresented()
如果有一或多位禮物確實顯示在螢幕上 (也就是在 View 收到 VSync 信號後),就會傳送 ->OnFramePresented()
。其中包含兩項主要資訊:
- 告知用戶端意見回饋的時間,讓他們評估影格排程策略是否運作 (延遲、影格遺失等)。
- 會表示「存在的效力已經更新 ViewTree 的狀態」的訊號)。
->OnFramePresented()
之後,針對與ViewTree
互動的 API (例如Flatland::ViewBoundProtocols
中的 API) 進行後續呼叫,皆會視為先前內容已套用 (不過之後可能會套用更多禮物)。