现代图形管道有多少帧?

Kay*_*Kay 3 opengl directx graphics metal vulkan

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

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

例如:(4)

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

Xir*_*ema 5

这取决于你使用的是哪种显卡,以及你将它放入哪种模式,但一般来说,答案是1-3帧(或2-4,如果你计算被推入的帧数缓冲区作为框架).

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

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

GPU可以选择缓冲额外的帧,就像在你的例子中一样,虽然这对于OpenK/DirectX11来说比Vulkan/DirectX12 +更常见,因为在后面这些API中,主机在什么方面更加明确. GPU应该这样做,我无法想象一个程序员会故意扩展帧缓冲区.除了Triple Buffering已经提供的功能之外,它还不是很清楚它会带来什么好处.