glBindFramebuffer 导致 OpenGLES 性能下降
glBindFramebuffer is causing performance drop in OpenGLES
我在 3 个 FBO 中进行渲染,所以我有 3 个通道。当我调用 glBindFramebuffer() 渲染到第三个 FBO 时,它导致我的应用程序以较低的 fps 运行。如果我只在所有 3 个通道中使用第 3 个 FBO 进行渲染,我将获得相同的 fps,但如果我在所有 3 个通道中使用第 1 个 FBO 进行渲染,我将获得更高的 fps。这种行为的原因可能是什么?
在 ES 中,取消绑定帧缓冲区通常会产生不直观的成本,因为为下一次绑定保留内容非常复杂。但是,您实际上通常并不希望保留内容——例如对于用户实际上可以看到的缓冲区,您几乎总是会清除、绘制几何图形、呈现、结束绘制循环;清除,绘制几何图形,呈现,结束绘制循环;等。因此,为下一次绑定保留缓冲区的内容没有任何好处。一旦呈现,您将永远不会再看内容。
在 ES 3 下,您可以使用 glInvalidateFramebuffer
发出信号;如果您的 GPU 和平台支持,请在 ES 2 下使用 EXT_discard_framebuffer。
当然,这个猜测假设当您渲染到第三个对象而不是第一个对象时,这意味着更频繁地更改绑定。
第二个猜测:如果您的额外帧缓冲区用于渲染到纹理,而您的第一个帧缓冲区是系统将您连接到屏幕所做的任何事情,那么显然存在潜在的性能差异,因为输出目标可能不是相同的格式。
我在 3 个 FBO 中进行渲染,所以我有 3 个通道。当我调用 glBindFramebuffer() 渲染到第三个 FBO 时,它导致我的应用程序以较低的 fps 运行。如果我只在所有 3 个通道中使用第 3 个 FBO 进行渲染,我将获得相同的 fps,但如果我在所有 3 个通道中使用第 1 个 FBO 进行渲染,我将获得更高的 fps。这种行为的原因可能是什么?
在 ES 中,取消绑定帧缓冲区通常会产生不直观的成本,因为为下一次绑定保留内容非常复杂。但是,您实际上通常并不希望保留内容——例如对于用户实际上可以看到的缓冲区,您几乎总是会清除、绘制几何图形、呈现、结束绘制循环;清除,绘制几何图形,呈现,结束绘制循环;等。因此,为下一次绑定保留缓冲区的内容没有任何好处。一旦呈现,您将永远不会再看内容。
在 ES 3 下,您可以使用 glInvalidateFramebuffer
发出信号;如果您的 GPU 和平台支持,请在 ES 2 下使用 EXT_discard_framebuffer。
当然,这个猜测假设当您渲染到第三个对象而不是第一个对象时,这意味着更频繁地更改绑定。
第二个猜测:如果您的额外帧缓冲区用于渲染到纹理,而您的第一个帧缓冲区是系统将您连接到屏幕所做的任何事情,那么显然存在潜在的性能差异,因为输出目标可能不是相同的格式。