OpenGL中的线程问题

用OpenGL做交互的时候,总需要处理点击事件吧。结果今天在处理点击事件的时候,遇到一个问题。当点击事件触发openGL的函数时返回的handle都是0。原以为资源没有释放,但是改变代码结构之后发现不是这个问题。仔细看log后发现了一句话:

call to OpenGL ES API with no current context (logged once per thread)

上网查查原因,说由于OpenGL是基于状态的,所以会为每个线程准备私有线程数据。所以新起一个线程来操作这个状态机当然就会有问题了。我怎么会新起一个线程呢?不都是UI线程在做这件事吗?错了。在使用GLSurfaceView的时候,Renderer里面都是在新线程里做的,目的是不耽误主线程办正事。所以,点击事件是UI线程发的,自然是另一个线程操作OpenGL。验证一下,在代码中打印调用OpenGL的线程号,结果初始化时是23396,点击事件触发的是1。找到问题了吧。

怎么解决?开始想在Renderer中写handler,可是系统说no。一时犯傻啊,既然系统设计了线程隔离机制,一定也会提供线程通信的方法喽!如下:

GLSurfaceView.queueEvent(Runnable r);

在点击的时候,操作放在Runnable中,就好啦~~

问题解决。

在Qt使用OpenGL进行多线程渲染可以提高渲染效率和用户体验。下面是一个基本的示例,演示了如何在Qt使用OpenGL进行多线程渲染: 1. 首先,在Qt创建一个新的OpenGL窗口类,继承自QOpenGLWidget。 ```cppclass MyGLWidget : public QOpenGLWidget{ public: MyGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {} protected: void initializeGL() override { // 初始化OpenGL环境 } void resizeGL(int w, int h) override { // 处理窗口大小变化事件 } void paintGL() override { // 执行OpenGL渲染操作 } }; ``` 2. 接下来,在主窗口类创建一个新的线程,并在该线程进行OpenGL渲染操作。 ```cppclass MainWindow : public QMainWindow{ public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建OpenGL窗口 m_glWidget = new MyGLWidget(this); setCentralWidget(m_glWidget); // 创建渲染线程 m_renderThread = new QThread(this); m_glWidget->moveToThread(m_renderThread); // 连接信号槽,触发渲染操作 connect(m_renderThread, &QThread::started, m_glWidget, &MyGLWidget::update); connect(m_glWidget, &MyGLWidget::frameSwapped, m_renderThread, &QThread::quit); connect(m_glWidget, &MyGLWidget::destroyed, m_renderThread, &QThread::quit); // 启动渲染线程 m_renderThread->start(); } private: MyGLWidget *m_glWidget; QThread *m_renderThread; }; ``` 在上述代码,我们在主窗口类的构造函数创建了一个OpenGL窗口,并将其移动到一个新的线程。然后,我们连接了一些信号槽,以触发渲染操作,并在窗口销毁时停止渲染线程。 这样,我们就可以在Qt使用OpenGL进行多线程渲染了。当启动应用程序时,渲染线程将开始执行OpenGL渲染操作,而主线程仍然可以响应用户交互事件。请注意,这只是一个简单的示例,你可能需要根据你的具体需求进行更多的代码调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值