我正在使用FBO + RBO,而不是默认帧缓冲区上的常规双缓冲,我正在绘制RBO,然后在单个缓冲的OpenGL上下文中直接在默认FBO(0)的GL_FRONT缓冲区上进行blit.
这很好,我没有任何闪烁,但如果场景有点复杂,我经历了巨大的fps下降,有些奇怪,我知道一些事情是错的.而且我不是指从1/60到1/30因为跳过同步,我的意思是突然下降了90%fps.
在blit之后我尝试了一个glFlush() - 没有区别,然后我在blit之后尝试了glFinish(),并且我有10x fps的提升.
所以我在默认的framebuffer和swapbuffers()上使用了常规的doble缓冲,并且fps也得到了提升,就像使用glFinish()时一样.
我无法弄清楚发生了什么.为什么glFinish()在它不应该做的时候会产生很大的不同?并且,可以直接在前缓冲区上使用RBO和blit,而不是在双缓冲上下文中使用swapbuffers调用吗?我知道我缺少vsync但是复合管理器无论如何都会同步(事实上我没有看到任何撕裂),就像监视器缺少10帧中的9帧一样.
出于好奇,本机swapbuffers()在windows或linux上使用glFinish()吗?
我认为这是一个与同步相关的问题。
当直接渲染到 RBO 并位图传输到前端缓冲区时,根本不存在任何同步。因此,在复杂的场景中,GPU 命令队列将很快填满,然后 CPU 驱动程序队列也将很快填满,直到驱动程序在 OpenGL 命令期间强制进行 CPU 同步。此时CPU 线程将停止。
我的意思是,如果没有任何形式的同步,复杂的渲染(将一个或多个 OpenGL 命令放入队列的渲染)总是会导致 CPU 线程在某个时刻停止,因为随着队列的填满, CPU将发出越来越多的命令。
为了获得平滑(更恒定)的用户交互,需要同步(使用特定于平台的 swapbuffers() 或 glFinish()),以阻止 CPU 发出越来越多的命令(这在转将使CPU线程稍后停止)
参考:OpenGL同步
| 归档时间: |
|
| 查看次数: |
1581 次 |
| 最近记录: |