调试OpenGL渲染慢的问题

最近有空在整理以前的游戏引擎,把一些设计的不够合理的地方重构一下,顺便加上以前没有做的地方,比如增强一下GUI,做到鼠标指针的渲染这一块的时候发现一个特别奇怪的问题,我的鼠标在在UI上划过去之后,渲染的光标会慢动作的拖过去,这个太怪异了,而程序内部的动画渲染则看起来是正常的。
刚开始是以为自己对X11不太理解,鼠标移动的时候会产生大量插值的坐标并放入到事件队列里去,翻遍了X11的文档,谷歌搜了好久,依然没有发现别人遇到类似的问题,那说明X11的代码这块是正常的,加了一段代码,用来计算每贞渲染耗时,基本是16~17ms,调试界面下就几个GUI而已,我去年才买的显卡渲染不至于这么慢吧,然后想到会不会是GUI渲染这块性能太差了,优化了一下,只在结构变化的时候重建顶点缓冲,把UI Widget的位置移到shader里控制,但是想也不太可能啊,毕竟GUI没有复杂到那种程度,这个优化后再测量,没渲染时间任何变动。

为了排除问题来自X11的事件机制,将渲染给屏蔽了,这次计算出来的FPS达到了3720357,这就说明问题肯定不在X11而在渲染这块,再开启FPS,发现FPS降低到60附近,刚才计算渲染时间的时候没有注意到这个16~17ms刚好是1000ms/60fps的结果,然后试了一下glxgears,居然也是60FPS,看来问题不在我的渲染引擎内部了,网上以“linux opengl 60 fps”为关键字搜了一下,找到问题根源了,原来是显卡驱动开了垂直同步,OpenGL里交换缓冲区的时候会堵塞住,直到屏幕刷新的时候才继续,目的是为了防止画面出现撕碎效果,试了一下,在NVIDIA的配置里将垂直同步关掉,发现一切正常了。

接下来要解决的问题,是要流畅的鼠标运动还是要垂直同步呢,解决方法是在每个循环处理事件的时候,一次性将事件队列里的事件全部处理完,然后再进行渲染,这样就鱼与熊掌都可兼得了。


Last modified on 2013-09-15