當前位置: 華文問答 > 遊戲

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之間的間隔是合理的