【问题标题】:Double Buffering vs Triple Buffering for Vertex Buffers顶点缓冲区的双缓冲与三重缓冲
【发布时间】:2017-11-30 00:20:29
【问题描述】:

许多图形编程资源似乎都建议使用三重缓冲数据以避免 GPU 上的同步。以下是几个例子:

OpenGL Insights - Asynchronous Buffer Transfers

Apple's Best Practices (Triple Buffering)

还有another source says that:

GPU 和 CPU 异步运行...但还有另一个因素:驱动程序。它可能会发生(并且在桌面驱动程序实现中经常发生)驱动程序也异步运行。为了解决这个甚至更复杂的同步场景,您可以考虑使用三重缓冲:

  • 一个 CPU 缓冲区
  • 给司机一个
  • 一个用于 gpu

这种方式应该不会在管道中出现停顿,但您需要为数据牺牲更多内存。

--

第三个缓冲区实际上是为驱动程序准备的吗?第三个缓冲区试图解决驱动程序上的什么同步问题?感觉我们可以只用两个缓冲区来避免所有同步。

【问题讨论】:

    标签: opengl graphics


    【解决方案1】:

    三重或双缓冲问题是在持久映射缓冲区的上下文中。我还没有使用持久映射的缓冲区,但我已经阅读了来自 Nvidia (How Modern OpenGL Can Radically Reduce Driver Overhead) 的演示文稿,其中讨论了该主题并解释了它是如何工作的。只有在每帧流式传输新数据时,才需要三重缓冲避免停顿

    • 您有责任不踩踏飞行中的数据。
    • 为什么是 3x?
      • 1x:GPU 现在正在使用什么。
      • 2x:驱动程序持有的东西,准备供 GPU 使用。
      • 3x:您要写的内容。
    • 3x 应该~保证足够的缓冲空间*...
    • 在开始写入新数据之前,使用栅栏确保渲染完成。

    上述演示文稿中引用的Efficient Buffer Management [McDonald 2012] 还提供了有关正确缓冲区管理的更深入信息。

    另请参阅概述efficient buffer update algorithm 的OpenGL wiki。

    只要您保护缓冲区内存区域不被栅栏覆盖,您甚至可以使用单个缓冲顶点缓冲区。然而,这会降低性能,因为您将失去异步内存传输的好处。写入操作将等待之前的渲染操作完成,从而序列化更新和绘制阶段。

    同样,所有这些双重和三重缓冲仅与 流式传输 改变每一帧的顶点数据相关。

    【讨论】:

    • 你说得对,我的问题是针对流式缓冲区。感谢您的消息来源——似乎 NVIDIA 建议使用 3 个缓冲区,因为驱动程序可以保留其中一个。这完美地回答了我的问题,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多