假设管道完全满: GPU等待vsync,GPU/driver命令缓冲区全部满,因此用户程序被阻塞。
有多少帧的数据在(现代的)管道中?
例如:(4)
发布于 2016-12-12 08:30:38
对于传统的API(非命令缓冲API),真正重要的是您使用了多少缓冲区。图形管道可能是流水线的,但管道的深度不足以使多个完全独立的帧同时被处理。所以GPU的队列和GPU本身通常只处理一个帧。
而且,由于这些API中没有为多个完整帧构建命令数据的真正方法,所以在运行过程中可以使用的帧数将受到实际使用缓冲区数量的限制。延迟帧的数目通常是缓冲区+ 1的数目,表示正在构建的帧。
对于命令缓冲区API,帧的数量通常是根据您有多少CPU内存来确定的。缓冲区的数量提供了一个最小值,但从技术上讲,没有什么可以阻止您提前缓冲几十个或数百个帧。在CPU内存之外。
当然,这假定您的所有每帧数据都位于CBs中。如果其中任何数据位于GPU可访问的内存中(例如矩阵数组等),或者需要在帧之间更改描述符集,那么现在需要缓冲另一组东西。这就对事物的深度施加了额外的限制。
发布于 2016-12-12 08:24:10
这取决于您正在使用的图形卡,以及您放置它的模式,但一般来说,答案是1-3帧(或者2-4,如果您正在计算正在作为帧推入缓冲区的帧)。
请注意,使用三重缓冲时,当缓冲区已满时,主机不会被阻塞。
GPU可能会选择缓冲额外的帧,就像在您的示例中一样,尽管这在OpenGL/DirectX11 11中更常见--而不是Vulkan/DirectX11 12+,因为在后一种API中,主机在GPU应该做的事情上更加明确,我无法想象一个程序员会任意地扩展帧缓冲区。目前还不清楚,除了已经提供的好处之外,它还能提供什么好处。
https://stackoverflow.com/questions/41104667
复制相似问题