glBindFramebuffer 导致 OpenGLES 的性能下降

Posted

技术标签:

【中文标题】glBindFramebuffer 导致 OpenGLES 的性能下降【英文标题】:glBindFramebuffer is causing performance drop in OpenGLES 【发布时间】:2016-03-08 01:24:58 【问题描述】:

我在 3 个 FBO 中进行渲染,所以我有 3 个通道。当我调用 glBindFramebuffer() 渲染到第三个 FBO 时,它会导致我的应用程序以较低的 fps 运行。如果我在所有 3 个通道中只使用第 3 个 FBO 进行渲染,我会获得相同的 fps,但如果我在所有 3 个通道中使用第一个 FBO 进行渲染,我会获得更高的 fps。这种行为的原因可能是什么?

【问题讨论】:

【参考方案1】:

在 ES 中解绑帧缓冲区通常会产生不直观的成本,因为为下一次绑定保留内容所涉及的复杂性。但是,您通常实际上并不希望保留内容 - 例如对于用户实际上可以看到的缓冲区,您几乎总是会清除、绘制几何图形、呈现、结束绘制循环;清除,绘制几何图形,呈现,结束绘制循环;等等。因此,为下一次绑定保留缓冲区的内容没有任何好处。一旦呈现出来,您将永远不会再看内容。

在 ES 3 下,您可以使用 glInvalidateFramebuffer 发出信号;如果您的 GPU 和平台支持,请在 ES 2 下使用EXT_discard_framebuffer。

当然,这个猜测假设当您渲染到第三个而不是第一个对象时,这意味着更频繁地更改绑定。

第二个猜测:如果您的额外帧缓冲区用于渲染到纹理,而您的第一个帧缓冲区是系统为将您桥接到屏幕所做的任何事情,那么显然存在潜在的性能差异,因为输出目标可能不同格式。

【讨论】:

以上是关于glBindFramebuffer 导致 OpenGLES 的性能下降的主要内容,如果未能解决你的问题,请参考以下文章

为啥 glBindFramebuffer(GL_FRAMEBUFFER, 0) 会导致 cocos2D-iphone 出现黑屏?

glBindFramebuffer 上的标志

OpenGL 不会通过调用 glBindFramebuffer(GL_FRAMEBUFFER,0) 渲染到屏幕

glReadPixels 导致崩溃

使用layer.open的时候,layer.msg导致弹窗关闭

nginx open files limits 导致大量错误信息