当 Vulkan 围栏发出信号时,是否有一种简单的方法可以唤醒我的程序?

问题描述

我正在编写一个程序,它使用 libev 来等待许多文件描述符。当数据传入时,会运行 vulkan 计算着色器来处理数据。该着色器的完成用栅栏表示。我宁愿不阻塞我的事件循环以等待完成返回结果。

我最初尝试使用 VkGetFenceFdKHR 获取文件描述符,并在栅栏上设置 VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT获取同步文件,但我针对的其中一台计算机不支持功能.

目前,我只是使用计时器和 vkGetFenceStatus 轮询围栏,但这感觉效率很低。有没有更好的方法来唤醒我的事件循环?

解决方法

我不知道这是否是一种更好的方式,因为我对基于文件描述符的同步没有真正的经验。但这里有一个替代方案。

您可以创建一个线程,其唯一目的是在围栏上进行阻塞,之后它将向 FD 发出信号。这在某些方面可能比您的计时器和轮询 API 更好,因为它不会浪费 CPU 周期。但它确实需要额外的线程唤醒,然后等待 FD 的线程才能看到它,因此可能会延迟响应。