关于QOpenGLWidget的多线程渲染

关于QOpenGLWidget的多线程渲染背景介绍我们知道,QOpenGLWidget是Qt中继承自QWidget的一个类,对OpenGL的渲染环境进行了很好的封装。用户在使用时只用继承并重写几个关键的虚函数即可完成OpenGL资源的准备和每帧画面的绘制。但是,也正是因为QOpenGLWidget是继承自QWidget的一个类,也决定了它的绘制函数是在UI线程调用的,也就是说,当我们重写了Q...
摘要由CSDN通过智能技术生成

关于QOpenGLWidget的多线程渲染

背景介绍

我们知道,QOpenGLWidget是Qt中继承自QWidget的一个类,对OpenGL的渲染环境进行了很好的封装。用户在使用时只用继承并重写几个关键的虚函数即可完成OpenGL资源的准备和每帧画面的绘制。
但是,也正是因为QOpenGLWidget是继承自QWidget的一个类,也决定了它的绘制函数是在UI线程调用的,也就是说,当我们重写了QOpenGLWidgetpaintGL函数时,该函数是在UI线程被调用的。那么如果我们在paintGL函数里花太多时间进行场景绘制的话,会直接导致UI线程的更新不及时,鼠标键盘交互事件被阻塞,造成界面卡死的现象。
所以当我们选择QOpenGLWidget来在Qt界面中进行OpenGL场景绘制时,我们需要一种更高效的方式来保证场景能够正常渲染,且不会造成UI线程的阻塞。通常情况下,我们的可以选择的方式是在QOpenGLWidget中应用多线程渲染。

方案介绍

下面,我来介绍一种在我们产品中被使用,证明有效且高效的一种QOpenGLWidget多线程渲染处理方式。这套方案针对的应用场景是当我们的OpenGL场景需要按照一定的帧速率定时进行更新,且OpenGL场景的绘制需要消耗相当长的时间,可能超过16甚至33毫秒时。在这种场景下,OpenGL的渲染肯定会阻塞UI线程,造成画面卡点,交互卡顿。我们多线程OpenGL渲染的核心流程是这样的
首先,我们需要一个Renderer对象,专门负责核心的OpenGL场景渲染逻辑,并且我们需要一个Render Thread来和Renderer进行绑定,作为核心OpenGL场景的渲染线程。
其次,我们需要为Renderer创建一个和QOpenGLWidgetQOpenGLContext共享的新QOpenGLContext对象,用于在Render Thread中作为渲染所使用的上下文。
我们在Renderer进行渲染时, 需要将场景的结果渲染到一个OpenGL纹理上,而不是直接绘制到Render Buffer上。由于渲染线程的上下文和UI线程的OpenGL上下文共享,这个纹理可以在QOpenGLWidget被访问,并最终绘制到主FBO上用于显示。

方案流程

1. 下面是该方案主要使用的三个类的构成:

解决方案构成

2. 下面是该方案的主要运行流程:

渲染流程

示例代码

头文件

#pragma once

#include <QtWidgets>

class RefTexture {
   GLuint mTexture;
   QAtomicInt mRefCount;
private:
   ~RefTexture();

public:
   RefTexture(int width, int height);
   void reta
  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Unity是一款跨平台的游戏引擎,可以在不同的操作系统和设备上进行游戏开发。在Unity中,开启多线程渲染可以提高游戏的性能和渲染效果。 在Unity中,开启多线程渲染意味着可以将渲染任务分配给不同的线程同时进行处理,从而加快渲染速度和提升游戏帧率。对于Window平台,Unity提供了使用DirectX 11多线程渲染的选项。 要在Unity中开启多线程渲染,首先需要确保使用的是支持DirectX 11的图形API。然后,在Unity编辑器的Player Settings中选择Windows平台的相关设置。在Rendering区域,可以找到Graphics API选项,将其设置为DirectX 11。 开启DirectX 11之后,就可以使用多线程渲染的功能了。在代码中,可以使用Unity的Graphics类和CommandBuffer类来提交渲染命令。可以将渲染命令封装在不同的CommandBuffer中,并使用多个线程同时提交这些命令,从而实现多线程渲染。 需要注意的是,开启多线程渲染在一些较低性能的设备上可能会导致一些兼容性问题,因此在开发过程中需要进行充分测试和优化。此外,多线程渲染也需要考虑线程同步和资源管理等问题,以避免潜在的错误和内存泄漏。 总之,Unity在Window平台上提供了多线程渲染的选项,可以通过配置Player Settings来启用,并通过使用Graphics和CommandBuffer类来实现多线程渲染。这将提高游戏的性能和渲染效果,为玩家带来更好的游戏体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值