QT中OPENGL的实时绘制
来源:互联网 发布:餐厅预订软件 编辑:程序博客网 时间:2024/05/17 09:28
原文http://www.cnblogs.com/dabaopku/archive/2012/02/09/2343979.html
问题
即便不使用 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中OPENGL的实时绘制
- Qt- 绘制实时曲线
- OpenGL中绘制的机场
- OpenGL中SolidCylinder的绘制
- qt + opengl 绘制地球
- OpenGL ES利用纹理绘制实时视频的关键步骤
- Qt customplot插件中绘制实时时间堆积曲线
- 在qt中使用opengl绘制图形动画
- Qt下的OpenGL 编程(3)绘制平面几何体
- Qt下的OpenGL 编程(3)绘制平面几何体
- OpenGL+QT实现矢量和影像的叠加绘制
- Qt下的OpenGL 编程(3)绘制平面几何体
- Qt Charts 动态实时折线图绘制
- QT中异形窗口的绘制
- OpenGL的数组绘制
- Opengl -- 五角星的绘制
- Opengl -- 五角星的绘制
- opengl点的绘制
- tcp通信函数详解
- yyyy
- 数据结构--循环单链表
- lftp下载上传限速
- 代码的坏味道之二十一 :Refused Bequest(被拒绝的遗贈)
- QT中OPENGL的实时绘制
- socket同步异步,阻塞,非阻塞的概念解析集合
- 从B 树、B+ 树、B* 树谈到R 树
- flume 几个比较有用的source、sink和decorator
- php中使用GD处理图片时,php文件为UTF-8编码时不能正常运行的问题
- asp.net 导出Excel时 身份证号码的正确导出
- 用 vs2010等系列软件编程如何在当前的文件中include其它文件夹中的头文件
- Enhancing Security with Device Management Policies 加强安全与设备管理策略 Developing for Enterprise
- Flume配置文件