opengl - 现代图形管道有多少帧深?

标签 opengl graphics directx metal vulkan

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

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

例如:(4)

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

最佳答案

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

  • 如果没有 Vsync 或任何其他类型的双缓冲策略,则不会强制要求在任何给定时间在内存中保留超过 1 帧,并在新帧被插入缓冲区时立即被覆盖。<
  • 启用垂直同步后,新帧会被推送到帧缓冲区的第二部分,并延迟任何 future 命令的执行,直到触发“垂直同步”(因此得名),此时两个帧被触发翻转。
  • 第三种模式,OpenGL 不常见,但 Vulkan 和 DirectX 用户熟悉,称为“信箱模式”,有时也称为“三重缓冲”,保留两个“后台缓冲区”,总共三个缓冲区:
    • 其中一个后台缓冲区保留供垂直同步触发时使用。
    • 另一个后台缓冲区直接接收完成的帧,没有延迟
    • 每当发生垂直同步时,这两个后台缓冲区的角色就会切换。

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

GPU 可能会选择缓冲额外的帧,就像在您的示例中一样,尽管这对 OpenGL/DirectX11- 比对 Vulkan/DirectX12+ 更常见,因为在后者的 API 中,主机在术语方面更加明确GPU应该做什么,我无法想象一个程序员会故意扩展帧缓冲区。除了 Triple Buffering 已经提供的功能之外,它还能提供什么好处还不是很清楚。

关于opengl - 现代图形管道有多少帧深?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41104667/

相关文章:

macos - 更改默认 OpenGL 上下文配置文件版本

c++ - 如何在 OpenGL 中进行 2D 缩放(GLFW,很高兴)?

c++ - 你如何在 osx 上使用 waf 链接 opengl 和 glut?

java - 运动中图形对象的鼠标监听器

python - 为什么4个按钮不显示?

c++ - DirectX 9 设备。渲染时创建顶点和索引缓冲区。(2 个线程)

windows - 可以在不同应用程序的窗口上绘制 OpenGL HUD 叠加层(不闪烁)吗?

opengl - 应用程序如何支持多个图形 API?

c++ - 尝试在 DirectX 11 中加载 Obj 文件时 vector 下标超出范围

directx - 如何使用着色器常量缓冲区?