【发布时间】: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