码迷,mamicode.com
首页 > 编程语言 > 详细

QT opengl多线程实现原理

时间:2020-03-24 20:29:16      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:手动   请求   paint   有一个   surf   obj   方法   使用   toc   

QT里的qopenglwidget提供了对多线程的知识,根据文档所说,想要在另一个线程中执行渲染操作,需要将该widget的context通过movetothread到该线程,手动makecurrent和donecurrent,然后执行渲染操作。总而言之QT中想让opengl在另一个线程渲染,需要的东西只有一个:属于该线程的context。知道这个,就可以以很多方法实现该功能了。

方法1

qt的example里面有一个threadedopengl例子,里面就是通过aboutToCompose和frameSwapped两个信号来控制渲染的,重写paintevent为空函数。当aboutTocompose时,停止渲染,可以以获取该线程互斥量的形式完成,交换完成后,释放互斥量,并发送信号,指示渲染线程开始渲染。渲染线程首先请求context,通过发送信号给gui线程,并用条件变量等待,gui将context所有权交给渲染线程,唤醒条件变量,渲染线程执行渲染操作,再重新转移context所有权,并用qmetaobject向其发送一个update操作。update操作又会触发abouttocompose,这样就不停渲染了。

方法2

虽然上面的方法很好,但是在同一级父窗口中有多个widget的时候就会出问题,原因是update会导致两个widget的abouttocompose,QT在发送这个信号之前会makecurrent,但如果有一个widget正在渲染,context的所有权并不属于gui时就会报错。所以需要用另一种方法,这里用渲染到纹理的方法解决了。QT中有QOpenGLContext和QOffscreenSurface,这两个的组合可以将渲染结果渲染到纹理上,这样gui显示该纹理,就能达到同样的效果。使用方法查看QT文档,这里就不说明了。

QT opengl多线程实现原理

标签:手动   请求   paint   有一个   surf   obj   方法   使用   toc   

原文地址:https://www.cnblogs.com/omsuki/p/11867054.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!