【问题标题】:OpenGL: Will recycling a Framebuffer in a frame hurt performance?OpenGL:在帧中回收帧缓冲区会损害性能吗?
【发布时间】:2019-09-18 08:18:08
【问题描述】:

帧缓冲区在被绘制到片段着色器和从片段着色器中采样之间频繁交换是否对 GPU 性能很重要?我也许可以通过在单个帧中回收帧缓冲区来节省视频内存,但我担心当 FBO 写入不相互依赖时,它可能会影响 GPU 可能进行的一些并行优化,或者只是以其他方式代价高昂。

背景:

在我的渲染器中,我在当前帧中分配我需要的所有帧缓冲区,如果可能的话,重用前一帧,并以这种方式使用它们:

FBO_0, FBO_1, FBO_n are allocated (FBO_n is the final output)

FBO_0 bind      ]_____________________ 
FBO_0 drawn to  ]                     \
FBO_n bind                             \
FBO_0 color used as a texture          Could the GPU be doing these two tasks
FBO_n drawn to with this texture       in parallel thanks to them using seperate FBO? 
                                       /
FBO_1 bind      ]_____________________/
FBO_1 drawn to  ]
FBO_n bind
FBO_1 color used as a texture
FBO_n drawn to with this texture

不过,在这种情况下,可以回收 FBO_0 以充当 FBO_1,从而减少我需要的整体视频内存。这在实践中有点复杂,并且需要大量重构,所以我正在研究这是否会对性能产生不利影响并且值得做。

【问题讨论】:

  • 现代 GPU 已针对以下功能进行了优化:清屏、绘制所有内容、显示。尝试重用前一帧中的任何内容都会妨碍 GPU 擅长的工作。所以,虽然可能它只会减慢速度。
  • 还有; 读取 GPU 内存到 CPU 内存是您可以做的最慢的事情之一。除非您必须,否则不要这样做。
  • @JesperJuhl - 我需要改写它; “读取”是指命令 GPU 将其作为片段着色器中的纹理读取,而不是将其下载到 cpu
  • 重新使用 FBO 是一个非常好的策略,只需在两次传递之间添加对 glInvalidateFramebuffer() 的适当调用,以便驱动程序知道不再需要数据(并且可能能够使用如果前一个仍在使用,则在引擎盖下使用不同的数据存储)

标签: c++ opengl optimization gpu opengl-3


【解决方案1】:

如果你只使用FBO_0和FBO_n就可以了,比如:

FBO_0 bind
FBO_0 drawn data1
FBO_n bind
FBO_0 color used as a texture
FBO_n drawn to with this texture

FBO_0 bind      
FBO_0 drawn data2
FBO_n bind
FBO_0 color used as a texture
FBO_n drawn to with this texture

一般来说,如果您写入一个对象,您稍后发出的任何命令都会看到新值。

可以在此 wiki 中找到少数例外情况:

https://www.khronos.org/opengl/wiki/Memory_Model

但最快的方法,很大程度上取决于 OpenGL 的实现。

在您的示例中,由于第一个“FBO_n 绘制”取决于 FBO_0 绘制的完成,因此实现可能会并行启动 FBO_1 绘制。但是你没有那个保证。

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多