Qt QGLWidget 不能够实时刷新的问题
2012-02-09 15:06
225 查看
问题
即便不使用 QGLWidget 而是使用 glut 系列,使用opengl进行渲染总是要面临这样的问题,什么时候需要重绘?最佳的用户体验自然是每次渲染结束后立即重绘。还在使用glut的时候,glutMainLoop就是这么搞得,以致随便跑个纹理程序就是100%的CPU,纯粹就是个死循环嘛。迁移到了 QGLWidget,上述问题似乎解决了。我们只需要重载 paintGL()函数即可,至于什么时候重绘,完全交给系统来控制——你当然也可以使用updateGL() 来强制重绘。
但是bug同样也接踵而至。如果我就是需要一个实时系统,要求QGLWidget每一帧绘制结束后立即重绘,如何是好?比如我写mpi的并行渲染程序,在每一帧渲染前要同步一次,而同步操作又是阻塞的,QGLWidget渲染的不实时性加上mpi的同步阻塞,自然导致了不能忍受的延迟。要想解决这个问题,只能从QGLWidget下手。怎么样能够让它实时渲染呢?虽然说实时渲染会带来100%的CPU消耗,但是mpi的阻塞不会使渲染死循环的调用,因此CPU并不会成为程序的瓶颈;同时实时渲染可以大大减小mpi MPI_BCast 同步的延时。
解决方案
一个非常simple的思路,在 paintGL() 函数体的最后加上 updateGL(), 这实际上陷入了一个无限递归的状态——updateGL()本来就是调用paintGL()来工作的。paintGL()又是回调函数,导致我们根本不知到在哪里会调用paintGL(),因此也就办法在paintGL()函数后调用updateGL()google也没有明确的解决方案,一种方案是使用Timer来重复绘制(http://developer.qt.nokia.com/forums/viewthread/3895),于情于理都不好。
我想了一个很山寨的方式,使用一个控制位决定是够updateGL()
int mmm=0; void gcBasicGLWidget::paintGL() { qglClearColor(backGroundColor); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //变换模型矩阵 glMatrixMode(GL_MODELVIEW); glPushMatrix(); glScalef(globalScale, globalScale, 1.0); glTranslatef(predefinedOffset.x(), predefinedOffset.y(), 0.0); glTranslatef(globalOffset.x(), globalOffset.y(), 0.0); //渲染 qglColor(foreGroundColor); render(); //恢复模型矩阵 glPopMatrix(); glFinish(); cout<<"render done"<<endl; mmm=1-mmm; if(mmm==1) updateGL(); cout<<"render returned"<<endl;; }
通过mmm变量决定时候重绘,从而每个paintGL递归两层后返回,并且返回后又接着渲染。这个也未免太山炮了。
最终解决方案隆重登场~~
感谢 wordlist师兄(http://weibo.com/wordlist)
将updateGL手动加入事件循环中。
一行代码秒杀全场
QMetaObject::invokeMethod(this,"updateGL",Qt::QueuedConnection);
加入到函数体最后即可,颤抖吧~
相关文章推荐
- Qt QGLWidget 不能够实时刷新的问题
- 关于JavaScript跨域问题 及 实时刷新
- qt中QtreeWidget与QstackWidget关联的问题
- 基于Qt的轨迹还原之二:用QGLWidget实现功能
- Qt:关于自定义widget显示不出背景颜色的问题
- OSG嵌入Qt的第二种方式:使用QOpenGLWidget/QGLWidget
- Android】开发中TabHost切换实时刷新的问题
- 解决 三星Note3 桌面小部件不实时更新/不刷新 的问题
- Qt:QTableWidget 使用的相关问题
- 如何使用QT的QPainter绘图和实时刷新?
- QT+OpenGL读取显示图片,OpenGL在QT里的刷新问题(好几篇)
- Qt:解决QListWidget/QTreeWidget选取Item不准确/偏移问题(右键菜单)
- Qt在苹果的Retina屏幕上的刷新问题
- 关于JavaScript跨域问题及实时刷新解决方案
- php+ajax实时刷新数据库信息遇到的缓存问题
- Qt QTableWidget 点击事件 重复问题的解决
- OpenGL在QT里的刷新问题
- 关于access的实时刷新问题
- 【Qt】QGLWidget窗口中gl函数的理解及运行流程