graphics - 为什么 vkAcquireNextImageKHR() 从不阻塞我的线程?

标签 graphics semaphore vulkan vsync

我正在使用 Vulkan graphics API(通过 BGFX )渲染。我一直在测量我的电话需要多少(挂钟)时间。

我不明白的是vkAcquireNextImageKHR () 总是很快,从不阻塞。即使我禁用超时并使用信号量来等待演示。

演示文稿锁定为 60Hz 显示速率,我看到我的主循环确实以 16.6 或 33.3 毫秒运行。

我不应该看到此显示速率的等待时间显示在 vkAcquireNextImageKHR() 的长度中吗?称呼?

分析器将这个调用测量为 0.2 毫秒左右,而不是帧的重要部分。

VkResult result = vkAcquireNextImageKHR(
    m_device
  , m_swapchain
  , UINT64_MAX
  , renderWait
  , VK_NULL_HANDLE
  , &m_backBufferColorIdx
);

目标硬件是手持控制台。

最佳答案

Vulkan 的全部目的是缓解 CPU 瓶颈。使 CPU 停止直到 GPU 为某些事情做好准备将与此相反。特别是如果 CPU 本身实际上并不打算使用此操作的结果。

因此,所有 vkAcquireNextImageKHR功能是让您知道接下来将向您提供哪个图像。这是为了让您能够使用该图像(例如,通过构建以某种方式引用该图像的命令缓冲区)而需要发生的最低限度。但是,您还无法使用该图像。

这就是为什么此功能需要您提供信号量和/或栅栏的原因:以便使用图像的进程可以等待图像可用。

如果消耗图像的进程只是命令缓冲区中的一堆命令(即:您使用 vkQueueSubmit 提交的内容),您可以简单地让这批工作等待提供给获取操作的信号量。这意味着所有的等待都发生在 GPU 中。它属于哪里。

如果您(出于某种原因)希望 CPU 能够等到获取完成,那么栅栏就在那里。但是 Vulkan 作为一个显式的、低级的 API,迫使你明确地说这是你想要的(而且它几乎从来不是你想要的)。

关于graphics - 为什么 vkAcquireNextImageKHR() 从不阻塞我的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60419749/

相关文章:

android - Android Xfermode的解释

math - 一些帮助渲染 Mandelbrot 集

java - 绘制形状在graphics2D中不起作用

Java 线程和 POSIX 线程,用户级还是内核级?

c# - System.Threading.ThreadPool 与信号量?

nvidia - 如何通过 Vulkan 使用 Nvidia 的 Tensor Core

c# - 多线程系统.Windows.图形

Vulkan:debugPrintfEXT 不打印任何内容

c++ - 特定尺寸的图像具有奇怪的内存大小

java - 使用信号量对数组进行排序