现代图形管道有多少帧?

时间:2016-12-12 15:57:53

标签: opengl graphics directx metal vulkan

假设管道已满:GPU等待vsync,GPU /驱动程序命令缓冲全部,因此用户程序被阻止。

(现代)管道中有多少帧数据?

例如:(4)

  1. GPU前置缓冲区中的帧
  2. GPU后台缓冲区中的帧
  3. GPU命令缓冲区中的帧
  4. CPU驱动程序命令缓冲区中的帧

2 个答案:

答案 0 :(得分:5)

这取决于您使用的是哪种显卡,以及您将其放入哪种模式,但一般来说,答案是1-3帧(如果您使用的话,则为2-4帧)。重新计算作为一个帧被推入缓冲区的帧。)

  • 如果没有Vsync或任何其他类型的双缓冲策略,没有任何强制要求在任何给定时间将任何超过1帧保留在内存中,一旦新帧被推入到帧中,就会被覆盖缓冲液中。
  • 当启用VSync时,新帧被推入帧缓冲区的第二部分,并延迟执行任何将来的命令,直到"垂直同步" (因此名称,显然)触发,此时两个帧被翻转。
  • 第三种模式,对于OpenGL而言并不常见,但对Vulkan和DirectX用户来说很熟悉,称为"信箱模式"或有时称为"三重缓冲",保留两个" Back Buffers& #34;共有三个缓冲区:
    • 其中一个后台缓冲区保留用于垂直同步触发时。
    • 另一个后台缓冲区直接接收已完成的帧,没有延迟
    • 每当发生垂直同步时,都会切换这两个后缓冲区的角色。

请注意,使用三重缓冲时,当缓冲区已满时,主机不会被阻止。

GPU可以选择缓冲其他帧,就像你的例子一样,虽然这对于OpenK / DirectX11来说比Vulkan / DirectX12 +更常见,因为在后面这些API中,主机的术语更为明确。 GPU应该做什么,我无法想象一个程序员会故意扩展帧缓冲区。除了Triple Buffering已经提供的服务之外,它还没有提供什么好处。

答案 1 :(得分:4)

对于传统的API(非命令缓冲区API),唯一真正重要的是您使用的缓冲区数量。图形管线可以是流水线的,但是管道不是很深,以至于多个完全独立的帧可以同时处理。因此,GPU的队列和GPU本身通常只处理单个帧。

由于这些API中没有真正的方法可以为多个整帧构建命令数据,因此您在飞行中可以拥有的帧数将受到您使用的实际缓冲区数量的限制。延迟帧的数量通常是缓冲区的数量+ 1,表示您正在构建的帧。

对于命令缓冲区API,帧数通常取决于您拥有的CPU内存量。缓冲区的数量最少,但从技术上讲,没有任何东西可以阻止您提前缓冲数十或数百帧。在CPU内存之外。

当然,这假设您的所有每帧数据都存在于CB中。如果任何数据存在于GPU可访问的内存中(例如,矩阵数组等),或者您需要在帧之间更改描述符集,那么现在您需要另外一组缓冲区。这对事情的深度施加了额外的限制。