Flatland 图片的生活

本文档介绍了平面图的生命周期。图像是像素位图和最常见的 Flatland 内容类型。图形应用通常希望将其界面绘制到缓冲区上并发送到系统合成器进行显示,这通过 Image 完成。Flatland 依靠 Sysmem API 和 Allcator API 分配这些图形缓冲区。

下面的序列图展示了客户端要分配、使用和销毁这些图形缓冲区的步骤。此图中介绍的每个步骤说明了原因和详细信息。

Flatland 图片序列的示意图

  1. 客户端通过创建 Sysmem 令牌来启动缓冲区分配。这会用到 Sysmem 分配流程中的通用步骤。Sysmem 允许分配共享内存以供多个应用和硬件块使用。Sysmem 的此功能正是图形缓冲区所需的内容:用于写入的缓冲区、GPU 可以访问且屏幕可读取的内容。此外,避免发送任何副本也很重要,因为图形缓冲区很大,复制操作成本高昂。

  2. 客户端复制 Sysmem 令牌,这些令牌将发送给其他参与者。在此序列中,焦点位于 Flatland 图片上,因此景物需要其中一个重复的令牌。不过,客户端可以根据需要随意重复和发送数据。即,视频播放器应用可能需要将其与解码器共享。请注意,所有 Sysmem 令牌都必须用于完成分配。

  3. 客户端使用一个令牌本身来绑定到 BufferCollectionBufferCollection 协议允许客户端与 Sysmem 进行交互。

  4. 客户端对 BufferCollection 设置了约束。请注意,每个 Sysmem 令牌都需要使用,且没有例外情况。客户端可能会在此处选择不设置限制条件。

  5. 客户端将其中一个 Sysmem 令牌发送到 Flatland 分配器。这是 Flatland 参与此缓冲区收集协商的阶段。客户端通过创建 fuchsia::ui::composition::BufferCollectionImportTokenfuchsia::ui::composition::BufferCollectionExportTokenpair. Client connects to fuchsia::ui::composition::Allocator service and sendsBufferCollectionExportToken` 和重复的 Sysmem 令牌来实现此目的。

  6. Flatland 会在后台设置缓冲区约束。Flatland 从 Vulkan 和显示硬件收集必要的约束条件。这样可确保 Flatland 可以直接使用缓冲区。在此阶段,系统会为此分配注册 BufferCollectionExportToken,任何 Flatland 实例都可以使用相应的 BufferCollectionImportToken 对其进行访问。此注册不限于单个 Flatland 实例,以防实例被拆除或客户端有多个 Flatland 实例,以避免重新分配或复制费用高昂的缓冲区。

  7. 客户端通过 BufferCollection 协议等待缓冲区分配完成。只有在使用所有重复的 Sysmem 令牌并发现符合所有参与者限制条件的重叠时,这种方法才能成功。如果任何令牌未使用,此调用可能会挂起。由于此操作可能阻塞或失败,因此预计会在客户端进行处理。一旦它返回成功信号,就会实际分配共享内存。

  8. 客户端使用 BufferCollectionImportToken 创建平面图片。客户端可以选择通过复制和使用此 BufferCollectionImportToken 来分配多个映像。所有这些对象均指向同一内存分配。

  9. 客户端完成平面图像创建后,会删除其所有 BufferCollectionImportTokens。这会向 Flatland 分配器发送信号,提示此后不会创建任何新的 Flatland 图片。这是一种令牌所有权模型,而不是 FIDL 协议中的明确发布方法,因此可以降低滥用和泄露风险。这还不能释放缓冲区,因为只要 Flatland 图片是引用的,它们就会一直存在。在释放缓冲区之前,需要执行下一步。

  10. 客户发布 Flatland 图片。所有引用 BufferCollection 的映像释放后,都会释放内存。