当前位置: 华文问答 > 游戏

Vulkan 1.2引入的时间线信号量介绍

2021-11-25游戏

引入时间线信号量

原文链接:

由于本人才疏学浅,翻译难免有误,望各位不吝惜指正。

当前Vulkan的同步模型

  • 两种粗粒度的同步原语:VkSemaphore和VkFence
  • VkSemaphore:设备与设备间的同步
  • 开关两个状态
  • 自动重置 - 1: 1 signal:wait
  • 队列操作可以wait和signal任意数量的semaphore
  • 可重复使用,但需要处于unsignaled状态
  • singal必须在wait之前入队列
  • VkFence:设备与主机的同步
  • 开关两个状态
  • 手动重置:1:N signal:wait
  • 队列操作最多signal一个fence
  • 可重复使用,但需要处于unsignaled状态
  • 新的模型:时间线信号量原语

  • 需要的同步原语数量大幅减少
  • 其中一些不能 直接 用已有的同步原语实现
  • 新的模型:时间线信号量原语

  • 同时支持设备与设备,设备与主机,主机与设备,主机与主机端的同步
  • 全方向的高效signal和wait支持
  • 新的模型:时间线信号量原语

  • 1:<N> Signal:Wait
  • 每一个signal操作对应多个wait操作(含0个)
  • 重复使用前不需要重置
  • 新的模型:时间线信号量原语

  • wait先于signal
  • 主机wait/设备wait需要在signal前
  • 不需要额外的锁来保护执行顺序
  • 新的模型:时间线信号量原语

  • 允许对同一个Semaphore的异步等待
  • 后续的signal不会影响到已有的/对之前signal的wait
  • Vulkan的时间线信号量

  • 扩展自已有的VkSemaphore API
  • 被所有使用VkSemaphore对象的核心VkQueue操作支持
  • 导出和导入使用现有的VkSemaphore API
  • 功能上是只有开关状态的VkSemaphore和VkFence的超集
  • 64位的单调递增计数替代VkSemaphore的开关状态
  • 它的值可以用来作为单调递增的时间戳,帧数等等
  • 新增在主机端Signal和Wait的API
  • 广泛的操作系统支持
  • 从Win7到Win10,Linux,Android
  • 存在的限制和妥协

  • 没有支持和窗口系统交互的API
  • vkQueuePresentKHR()和vkAcquireNextImageKHR()目前还不支持它
  • 操作系统的支持还不太广泛
  • 需要解决若干API语义问题
  • 导入/导出支持不是强制的
  • 依赖的内核级别的支持并非广泛可用
  • 在Win10+和使用较新内核/驱动的Linux,设备上支持
  • 虽然是64位值,但与未完成的操作之间的间隔可能只允许31位大小
  • 为了32位的硬件和操作系统也能通过包装实现它们
  • 仍然支持64位值,只要signal和wait之间的间隔是合理的