Flatland 时间轴

在典型的帧中,使用 Flatland API 时的事件顺序如下1

  1. 客户端调用 Flatland::Present()
  2. 达到 PresentArgs::requested_presentation_timePresentArgs::server_wait_fences 已发出信号后,等待观看。
    • requested_presentation_time 是当前对象可能出现在屏幕上的最早时间。
    • server_wait_fences 是一组锆石事件(“栅栏”),在通过 Present() 调用提交的内容可能会显示在显示屏上之前,这些事件必须全部收到信号。
  3. View 会通过此帧合成来自所有客户端的内容,并将其发送到显示屏。
  4. Scape 将 Flatland::->OnNextFrameBegin() 发送到客户端。
  5. 客户端开始创建下一帧。
  6. 图片实际显示后,Sce 向客户端发送 Flatland::->OnFramePresented()
  7. 从 1 开始重复。

本文档介绍了每个信号的含义。

Present()

当客户端进行 Flatland API 调用时,这些操作实际上并不会立即应用。而是在调用 Present() 时以原子方式捆绑和提交这些更新。对 Present() 的两次调用之间的这组更新在本文档中称为 present

调用 Present() 时,客户端会传递参数表 PresentArgs,其中包含有关如何处理 Present() 调用的参数。决定 activity 何时在屏幕上显示的最重要参数是 requested_presentation_timeserver_wait_fences

如需详细了解如何处理 Present() 调用,请参阅帧调度

->OnNextFrameBegin()

系统会将 ->OnNextFrameBegin() 作为提示发送给客户端,提示客户端应何时开始创建下一帧。不过,此数据集并未明确说明 Views 的状态,除非{8} 认为资源争用相对较低。OnNextFrameBegin() 仅在客户端进行之前的 Present() 调用后发送,且仅在客户端存在剩余赠金时发送。

->OnFramePresented()

当一个或多个礼物实际出现在屏幕上时(即在 Sense 收到 VSync 信号之后),系统会发送 ->OnFramePresented()。它提供了两条主要信息:

  • 将反馈给客户端的时间,以便他们评估帧调度策略的效果(延迟、丢帧等)。
  • 它用于指示展示效果何时更新了 ViewTree) 的状态。在 ->OnFramePresented() 之后,Senss 可保证对与 ViewTree 交互的 API(例如 Flatland::ViewBoundProtocols 中的 API)的任何后续调用都将表现得就像应用了上一个呈现时一样(尽管此后可能会应用更多呈现效果)。

  1. 无法保证这些事件的确切顺序。例如,->OnNextFrameBegin() 可能发生在 ->OnFramePresented() 之后,或者客户端可能会在收到 ->OnFramePresented() 之前再次调用 Present()。对于大多数客户而言,这些边缘情况不应成为问题。它们应该只使用来自 ->OnNextFrameBegin() 的信号来绘制下一帧,并使用 ->OnNextFramePresented() 收集数据,在这种情况下,不会发生冲突。