QOpenGLWidget的多线程渲染

2024-02-22 01:18

本文主要是介绍QOpenGLWidget的多线程渲染,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于QOpenGLWidget的多线程渲染_VE视频引擎的博客-CSDN博客_qopenglwidget

Qt使用OpenGL进行多线程离屏渲染(原理讲的很好)   

Qt使用OpenGL进行多线程离屏渲染_imred的专栏-CSDN博客_qoffscreensurfaceQt使用OpenGL进行多线程离屏渲染 - it610.com

基于Qt WidgetsQt程序,控件的刷新默认情况下都是在UI线程中依次进行的,换言之,各个控件的QWidget::paintEvent方法会在UI线程中串行地被调用。如果某个控件的paintEvent非常耗时(等待数据时间+CPU处理时间+GPU渲染时间),会导致刷新帧率下降,界面的响应速度变慢。

假如这个paintEvent耗时的控件没有使用OpenGL渲染,完全使用CPU渲染。这种情况处理起来比较简单,只需要另外开一个线程用CPU往QImage里面渲染,当主线程调用到这个控件的paintEvent时,再把渲染好的QImage画出来就可以了,单纯绘制一个QImage还是很快的。

如果这个paintEvent耗时的控件使用了OpenGL渲染,情况会复杂一些,因为想要把OpenGL渲染过程搬到另外一个线程中并不是直接把OpenGL调用从UI线程搬到渲染线程就可以的,是需要做一些准备工作的。另外,UI线程如何使用渲染线程的渲染结果也是一个需要思考的问题。



QT opengl多线程实现原理

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文档,这里就不说明了。

这篇关于QOpenGLWidget的多线程渲染的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/733694

相关文章

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

JAVA- 多线程

一,多线程的概念 1.并行与并发 并行:多个任务在同一时刻在cpu 上同时执行并发:多个任务在同一时刻在cpu 上交替执行 2.进程与线程 进程:就是操作系统中正在运行的一个应用程序。所以进程也就是“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看 到进程) 线程:是程序运行的基本执行单元。当操作系统执行一个程序时, 会在系统中建立一个进程,该进程必须至少建立一个线

多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

目录 一、LinkedBlockingDeque是什么 二、核心属性详解 三、核心方法详解 addFirst(E e) offerFirst(E e) putFirst(E e) removeFirst() pollFirst() takeFirst() 其他 四、总结 一、LinkedBlockingDeque是什么 首先queue是一种数据结构,一个集合中

多线程篇(阻塞队列- LinkedBlockingQueue)(持续更新迭代)

目录 一、基本概要 1. 构造函数 2. 内部成员 二、非阻塞式添加元素:add、offer方法原理 offer的实现 enqueue入队操作 signalNotEmpty唤醒 删除线程(如消费者线程) 为什么要判断if (c == 0)时才去唤醒消费线程呢? 三、阻塞式添加元素:put 方法原理 图解:put线程的阻塞过程 四、非阻塞式移除:poll方法原理 dequ

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

spring笔记 多线程的支持

spring的工作机制 136  属性编辑器 140 spring事件的体系结构 168 Bean间的关系 109 继承 依赖 引用     Bean的继承          1 为了简化初始化的属性注入;          2 子Bean和父Bean相同的属性值,使用子Bean的     Bean的依赖 Srping控制相互依赖的Bean之间,属性注入的顺序,防止出错  depend-on

【编程底层思考】详解Java的JUC多线程并发编程底层组件AQS的作用及原理

Java中的AbstractQueuedSynchronizer(简称AQS)是位于java.util.concurrent.locks包中的一个核心组件,用于构建锁和其他同步器。AQS为实现依赖于FIFO(先进先出)等待队列的阻塞锁和相关同步器提供了一套高效、可扩展的框架。 一、AQS的作用 统一同步状态管理:AQS提供了一个int类型的成员变量state,用于表示同步状态。子类可以根据自己

多线程的系列文章

Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1)   Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多线程学习(四)等待/通知(wait/notify)机制 Java多线程学习(五)线程间通信知识点补充 Java多线程学习(六)Lock锁的使用 Java多