在典型的帧中,使用 Flatland API 时的事件顺序如下1:
- 客户端调用
Flatland::Present()
。 - 达到
PresentArgs::requested_presentation_time
且PresentArgs::server_wait_fences
已发出信号后,等待观看。requested_presentation_time
是当前对象可能出现在屏幕上的最早时间。server_wait_fences
是一组锆石事件(“栅栏”),在通过Present()
调用提交的内容可能会显示在显示屏上之前,这些事件必须全部收到信号。
- View 会通过此帧合成来自所有客户端的内容,并将其发送到显示屏。
- Scape 将
Flatland::->OnNextFrameBegin()
发送到客户端。 - 客户端开始创建下一帧。
- 图片实际显示后,Sce 向客户端发送
Flatland::->OnFramePresented()
。 - 从 1 开始重复。
本文档介绍了每个信号的含义。
Present()
当客户端进行 Flatland API 调用时,这些操作实际上并不会立即应用。而是在调用 Present()
时以原子方式捆绑和提交这些更新。对 Present()
的两次调用之间的这组更新在本文档中称为 present
。
调用 Present()
时,客户端会传递参数表 PresentArgs
,其中包含有关如何处理 Present()
调用的参数。决定 activity 何时在屏幕上显示的最重要参数是 requested_presentation_time
和 server_wait_fences
。
如需详细了解如何处理 Present()
调用,请参阅帧调度。
->OnNextFrameBegin()
系统会将 ->OnNextFrameBegin()
作为提示发送给客户端,提示客户端应何时开始创建下一帧。不过,此数据集并未明确说明 Views 的状态,除非{8} 认为资源争用相对较低。OnNextFrameBegin()
仅在客户端进行之前的 Present()
调用后发送,且仅在客户端存在剩余赠金时发送。
->OnFramePresented()
当一个或多个礼物实际出现在屏幕上时(即在 Sense 收到 VSync 信号之后),系统会发送 ->OnFramePresented()
。它提供了两条主要信息:
- 将反馈给客户端的时间,以便他们评估帧调度策略的效果(延迟、丢帧等)。
- 它用于指示展示效果何时更新了 ViewTree) 的状态。在
->OnFramePresented()
之后,Senss 可保证对与ViewTree
交互的 API(例如Flatland::ViewBoundProtocols
中的 API)的任何后续调用都将表现得就像应用了上一个呈现时一样(尽管此后可能会应用更多呈现效果)。
-
无法保证这些事件的确切顺序。例如,
->OnNextFrameBegin()
可能发生在->OnFramePresented()
之后,或者客户端可能会在收到->OnFramePresented()
之前再次调用Present()
。对于大多数客户而言,这些边缘情况不应成为问题。它们应该只使用来自->OnNextFrameBegin()
的信号来绘制下一帧,并使用->OnNextFramePresented()
收集数据,在这种情况下,不会发生冲突。↩