我正在使用FBO+RBO技术,并且不使用默认帧缓冲的双缓冲技术,而是将内容绘制到RBO上,然后在单个缓冲的OpenGL环境中直接将其复制到默认FBO(0)的GL_FRONT缓冲区。
这种方式看起来没有问题,也没有出现闪烁,但当场景变得较为复杂时,帧率会突然骤降90%,情况非常奇怪,我知道一定有什么地方不对。这里的问题不是因为跳帧导致的从60fps掉到30fps的那种情况,而是一个突然的大幅度帧率下降。
我尝试了在复制操作之后调用glFlush()函数,但没有任何效果,然后我试了试在复制操作之后调用glFinish()函数,结果帧率提升了10倍。
于是我改成了使用默认帧缓冲的双缓冲技术,通过swapbuffers()函数进行切换,发现帧率也有所提升,与使用glFinish()函数的效果差不多。
我无法弄清楚发生了什么事情,为什么调用glFinish()函数会产生如此大的影响,而且,在双缓冲环境中,是否可以直接在前缓冲区使用RBO进行复制,而不是调用swapbuffers()函数?我知道我忽略了垂直同步,但复合管理器仍会执行同步操作(实际上我没有看到任何撕裂),就像显示器少显示了10帧一样。
顺便问一下,在Windows或Linux上,本地的swapbuffers()函数是否使用了glFinish()函数呢?
这种方式看起来没有问题,也没有出现闪烁,但当场景变得较为复杂时,帧率会突然骤降90%,情况非常奇怪,我知道一定有什么地方不对。这里的问题不是因为跳帧导致的从60fps掉到30fps的那种情况,而是一个突然的大幅度帧率下降。
我尝试了在复制操作之后调用glFlush()函数,但没有任何效果,然后我试了试在复制操作之后调用glFinish()函数,结果帧率提升了10倍。
于是我改成了使用默认帧缓冲的双缓冲技术,通过swapbuffers()函数进行切换,发现帧率也有所提升,与使用glFinish()函数的效果差不多。
我无法弄清楚发生了什么事情,为什么调用glFinish()函数会产生如此大的影响,而且,在双缓冲环境中,是否可以直接在前缓冲区使用RBO进行复制,而不是调用swapbuffers()函数?我知道我忽略了垂直同步,但复合管理器仍会执行同步操作(实际上我没有看到任何撕裂),就像显示器少显示了10帧一样。
顺便问一下,在Windows或Linux上,本地的swapbuffers()函数是否使用了glFinish()函数呢?
glFinish
可以解决这个问题)。如果能提供更多代码就更好了。 - Christian Rau