在 Vulkan 中,Semaphore和 Fence都用于同步,但同步的方向和用途并不相同,无法随意互换:
Semaphore(GPU-GPU 同步)
主要用于 GPU 和 GPU 之间的执行顺序控制,例如:
等待渲染完成后再进行后续渲染
等待渲染完成后再进行呈现操作(queuePresent() 里用的就是信号量)
通常不会让 CPU 等待。Semaphore 一旦在 GPU 端被 vkQueueSubmit 等操作使用完,就会自动重置供下次使用。
Fence(CPU-GPU 同步)
主要用于 CPU 等待 GPU 工作完成:
提交指令后,CPU 可以使用 vkWaitForFences 等待 GPU 渲染结束
Fence 在完成后会保持已触发状态(signaled),必须手动 vkResetFences 才能再用
对 GPU 来说,Fence 不会用来控制命令缓冲区之间的执行顺序,而是让 CPU 知道某个提交是否完成。
因此,二者并不等价。常见场景中,呈现(queuePresent)需要使用信号量来与渲染进行 GPU 级同步,而在需要 CPU 知道渲染是否完成时(比如重用命令缓冲区或进行下一帧逻辑),就需要使用栅栏来让 CPU 等待 GPU。
vulkan Semaphore和 Fence同步
最新推荐文章于 2025-02-07 16:48:53 发布