【发布时间】:2013-07-12 05:58:59
【问题描述】:
我使用的是 FBO+RBO,而不是在默认帧缓冲区上进行常规双缓冲,而是绘制到 RBO,然后在单个缓冲 OpenGL 上下文中直接在默认 FBO (0) 的 GL_FRONT 缓冲区上进行 blit。
这很好,我没有任何闪烁,但如果场景变得有点复杂,我会经历 fps 的巨大下降,这太奇怪了,我知道一定有问题。而且我的意思不是从 1/60 到 1/30,因为跳过同步,我的意思是突然 90% 的 fps 下降。
我在 blit 之后尝试了 glFlush() - 没有区别,然后我在 blit 之后尝试了 glFinish(),我得到了 10 倍 fps 的提升。
所以我在默认帧缓冲区和 swapbuffers() 上使用了常规双缓冲,并且 fps 也得到了提升,就像使用 glFinish() 时一样。
我无法弄清楚发生了什么。为什么 glFinish() 在不应该的情况下会产生如此大的影响?并且,可以直接在前端缓冲区上使用 RBO 和 blit,而不是在双缓冲上下文中使用 swapbuffers 调用吗?我知道我缺少 vsync,但复合管理器无论如何都会同步(事实上我没有看到任何撕裂),就好像监视器在 10 帧中缺少 9 帧。
出于好奇,本机 swapbuffers() 在 windows 或 linux 上使用 glFinish() 吗?
【问题讨论】:
-
“然后我在 blit 之后尝试了 glFinish(),我得到了 10 倍 fps 的提升” - 听起来像是你的计时方法有问题,就像它是不能与您的 GPU 很好地同步(
glFinish当然可以实现)。更多代码会很有趣。 -
考虑到诸如三重缓冲、自适应垂直同步等驱动程序中的所有内容,我不认为重新实现双缓冲会更好。
-
@BartekBanachewicz 如果您需要用于屏幕和屏幕外渲染的缓冲区,这是有道理的,但您确实需要做很多工作来(重新)优化屏幕部分。
-
你真的看到帧率的不同了吗?您应该注意到在更复杂的场景中下降了 90%,尤其是在移动时。另外:FPS 是一个令人困惑的性能测量单位,通常首选渲染时间(例如每帧 X 毫秒)。