假设管道已满:GPU等待vsync,GPU /驱动程序命令缓冲全部,因此用户程序被阻止。
(现代)管道中有多少帧数据?
例如:(4)
答案 0 :(得分:5)
这取决于您使用的是哪种显卡,以及您将其放入哪种模式,但一般来说,答案是1-3帧(如果您使用的话,则为2-4帧)。重新计算作为一个帧被推入缓冲区的帧。)
请注意,使用三重缓冲时,当缓冲区已满时,主机不会被阻止。
GPU可以选择缓冲其他帧,就像你的例子一样,虽然这对于OpenK / DirectX11来说比Vulkan / DirectX12 +更常见,因为在后面这些API中,主机的术语更为明确。 GPU应该做什么,我无法想象一个程序员会故意扩展帧缓冲区。除了Triple Buffering已经提供的服务之外,它还没有提供什么好处。
答案 1 :(得分:4)
对于传统的API(非命令缓冲区API),唯一真正重要的是您使用的缓冲区数量。图形管线可以是流水线的,但是管道不是很深,以至于多个完全独立的帧可以同时处理。因此,GPU的队列和GPU本身通常只处理单个帧。
由于这些API中没有真正的方法可以为多个整帧构建命令数据,因此您在飞行中可以拥有的帧数将受到您使用的实际缓冲区数量的限制。延迟帧的数量通常是缓冲区的数量+ 1,表示您正在构建的帧。
对于命令缓冲区API,帧数通常取决于您拥有的CPU内存量。缓冲区的数量最少,但从技术上讲,没有任何东西可以阻止您提前缓冲数十或数百帧。在CPU内存之外。
当然,这假设您的所有每帧数据都存在于CB中。如果任何数据存在于GPU可访问的内存中(例如,矩阵数组等),或者您需要在帧之间更改描述符集,那么现在您需要另外一组缓冲区。这对事情的深度施加了额外的限制。