Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一条现代图形管道有多少帧深?

一条现代图形管道有多少帧深?
EN

Stack Overflow用户
提问于 2016-12-12 07:57:52
回答 2查看 1.2K关注 0票数 3

假设管道完全满: GPU等待vsync,GPU/driver命令缓冲区全部满,因此用户程序被阻塞。

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

例如:(4)

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-12 08:30:38

对于传统的API(非命令缓冲API),真正重要的是您使用了多少缓冲区。图形管道可能是流水线的,但管道的深度不足以使多个完全独立的帧同时被处理。所以GPU的队列和GPU本身通常只处理一个帧。

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

对于命令缓冲区API,帧的数量通常是根据您有多少CPU内存来确定的。缓冲区的数量提供了一个最小值,但从技术上讲,没有什么可以阻止您提前缓冲几十个或数百个帧。在CPU内存之外。

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

票数 4
EN

Stack Overflow用户

发布于 2016-12-12 08:24:10

这取决于您正在使用的图形卡,以及您放置它的模式,但一般来说,答案是1-3帧(或者2-4,如果您正在计算正在作为帧推入缓冲区的帧)。

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

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

GPU可能会选择缓冲额外的帧,就像在您的示例中一样,尽管这在OpenGL/DirectX11 11中更常见--而不是Vulkan/DirectX11 12+,因为在后一种API中,主机在GPU应该做的事情上更加明确,我无法想象一个程序员会任意地扩展帧缓冲区。目前还不清楚,除了已经提供的好处之外,它还能提供什么好处。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41104667

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档