平地時間軸

在一般影格中,使用 Flatland API 時的事件順序如下所示1

  1. 用戶端呼叫 Flatland::Present()
  2. 等待景色到 PresentArgs::requested_presentation_time 且接收到 PresentArgs::server_wait_fences 訊號為止。
    • requested_presentation_time 是現在可能顯示在螢幕上的最早時間。
    • server_wait_fences 是一組 Zircon 事件 (「圍欄」),這類事件必須先收到信號,才能顯示透過 Present() 呼叫提交的內容。
  3. 風景會合成所有用戶端的內容,並傳送至這個影格。
  4. 顯示畫面會將 Flatland::->OnNextFrameBegin() 傳送至用戶端。
  5. 用戶端開始建立下一個影格。
  6. 圖片實際顯示後,Lake 會將 Flatland::->OnFramePresented() 傳送至用戶端。
  7. 從 1 重複以上步驟。

本文件將說明這些信號的意義。

Present()

由於用戶端發出 Flatland API 呼叫,這些作業實際上並未立即套用。而是在呼叫 Present() 時以不可分割的形式修訂這些更新。兩次呼叫 Present() 之間的一組更新,在本文件中稱為 present

呼叫 Present() 時,用戶端傳遞引數資料表 PresentArgs,其中包含 Present() 呼叫應如何處置的引數。決定螢幕顯示時機最重要的引數是 requested_presentation_timeserver_wait_fences

如要進一步瞭解 Present() 呼叫的處理方式,請參閱「影格排程」。

->OnNextFrameBegin()

->OnNextFrameBegin() 會以提示的形式傳送給用戶端,說明何時應開始建立下一個影格。儘管沒有明確指出風景狀態的任何資訊,但景觀區認為資源爭用情形應相對較低。只有在用戶端進行先前的 Present() 呼叫,且用戶端仍有抵免額時,才會傳送 OnNextFrameBegin()

->OnFramePresented()

如果有一或多位禮物確實顯示在螢幕上 (也就是在 View 收到 VSync 信號後),就會傳送 ->OnFramePresented()。其中包含兩項主要資訊:

  • 告知用戶端意見回饋的時間,讓他們評估影格排程策略是否運作 (延遲、影格遺失等)。
  • 會表示「存在的效力已經更新 ViewTree 的狀態」的訊號)。->OnFramePresented() 之後,針對與 ViewTree 互動的 API (例如 Flatland::ViewBoundProtocols 中的 API) 進行後續呼叫,皆會視為先前內容已套用 (不過之後可能會套用更多禮物)。

  1. 我們無法保證這些事件的確切順序。舉例來說,->OnNextFrameBegin() 可能會在 ->OnFramePresented() 之後發生,或者用戶端可能會在收到 ->OnFramePresented() 前再次呼叫 Present()。對大多數客戶而言,這些極端案件應該不需要擔心。這些應該只使用 ->OnNextFrameBegin() 的信號繪製下一個影格,並使用 ->OnNextFramePresented() 收集資料,在這種情況下,應不會發生衝突。