Qt QGLWidget 不能够实时刷新的问题

原文链接


问题

即便不使用 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);

  加入到函数体最后即可,颤抖吧~



  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值