屏幕截图

屏幕捕获是捕获将在客户端上显示的图形内容的过程。

背景

View 为客户端提供了初始 Screen Capture API,可立即渲染帧并将其呈现给客户端。客户端对于内容的生成时间或何时获取下一帧一无所知。此问题的解决方案仍然会导致效率低下,并且并非稳定状态捕获(例如使用 Meet 等应用)的最佳选择。

在新的 Screen Capture API 中,SSI 可以消除原始 API 给客户端带来的复杂性,并为客户提供更简单的界面。

设计

“屏幕截取”功能旨在分担调度下一个帧(而不是客户端)的调度工作。这一点是使用 Frame Scheduler 实现的,它目前知道 VSYNC 和锁存点的时间。从客户端对 GetNextFrame() 的调用将是一个挂起请求,而不是在客户端请求下一帧后立即渲染并返回帧。帧调度器和 Flatland 将执行工作并在渲染下一帧后与 API 通信。然后,Screen Capture 会向调用 GetNextFrame() 的所有客户端提供可渲染对象。

屏幕截取管理器会保留每个客户端的状态。当客户端请求下一帧时,如果它们已收到所生成的最后帧,则管理器会等到收到来自帧调度程序的信号,然后再返回该帧。

如果客户端尚未收到生成的最后一帧,屏幕截取功能将立即返回最新帧。这种情况发生在客户端首次调用屏幕截取期间,因为它们尚未收到上一帧,以及客户端错过帧后的任何调用。客户端现在会收到最新生成的帧。

屏幕截取流程

API 设计

Configuration()

用于配置 Screen Capture API 的主要协议。客户端应首先使用 Flatland 分配器注册要使用的 BufferCollection。然后,开发者应调用 Configure(),因为这将配置要在屏幕捕获期间使用的设置、缓冲区和图像。

GetNextFrame()

GetNextFrame() 会尽快将未看到的最新帧返回给客户端。如果客户端尚未收到最后显示的帧,则会立即返回此帧。如果它们已呈现,则将是下一个要渲染的帧。

丢弃缓冲区

当客户端使用完缓冲区后,客户端应丢弃 GetNextFrame() 回调中包含的事件对。