用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多线程,采用2D纹理贴图的方式,多线程进行纹理拷贝和渲染。
用多线程实现OpenGL渲染, 子线程负责渲染, 主线程负责干其他事情.
发了一天功夫才把多线程的问题搞定,上传以后使用。若其他读者看到,希望能看懂我的苦心。thread相关的CPP需要你自己加上去,它们在压缩文件里面。
MFCwithOpenGLWindow-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码.
在visual stdio 2010 中开发的使用opengl图形库的三维动画程序,程序读取ASF/AMC 文件并进行解读,实现实时的数据驱动的角色动画。程序会根据AMC文件生成播放列表,产生连续播放,两个不同动作文件之间会有光滑过渡...
OpenGL和其他图形开发人员面临的一个常见问题是从各自的图形上下文中发出图形命令。 例如,OpenGL渲染调用只能从OpenGL上下文处于活动状态的单个线程进行; 同样,OpenAL音频呼叫只能从OpenAL线程进行。 当游戏或...
MFCwithOpenGLWindow51-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码,增加了glut定时控制显示刷新,可以在MFC中控制GL的绘图。
swGL:C ++中OpenGL 1.3的多线程软件实现
采用VBO技术的真正的多线程多窗口OpenGL程序 vs2008编译通过。
MFCwithOpenGLWindow-用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口源码
使用现代OpenGL+Qt,同时实现使用逐顶点和逐片元渲染方法,详见博文:现代OpenGL+Qt学习笔记之十:使用逐片元渲染提升真实感http://blog.csdn.net/chaojiwudixiaofeixia/article/details/78187060
win32窗口实现的多显示器多窗口多线程OpenGL程序源代码. 可以全屏及窗口显示.
运行时点击渲染,弹出对话框后在四个text控件中分别显示四幅OpenGL渲染得到的图像。用到了多线程
4、通过 EGL 线程中渲染GL_TEXTURE_EXTERNAL_OES对应的纹理ID; 5、在 EGL 线程完成渲染后,通过eglSwapBuffers交换缓冲,将EGL渲染内容交换到MediaCodeC给定的Surface中,从而完成mp4视频录制。
QT OpenGL多线程播放YUV420序列,内附测试序列可直接运行。 被实例是对QT自带实例中的threadedqopenglwidget工程的修改,模拟从网络接收到的YUV序列进行修改和优化,避免主线程等待而导致进程无响应。
Android_3D_OpenGL ES 基础教程(中文版),从3D相关的基本概念讲起,也是很好的入门资料,需要的同仁拿去
使用ffmpeg软解码视频数据,SDL_audio播放音频数据,SDL_thread管理线程,openGL渲染YUV420数据到UIView。项目太大,自行到github下载。
包括如何成功地初始化OpenGL并将数据发送到屏幕上,如何使用基本的向量和矩阵数学创建三维世界,以及Android的许多特定细节,比如在Dalvik虚拟机和本地环境之间编码数据(marshaldata)以及如何在主线程和渲染线程间...
Qt 多线程实现波形图标,一个简单的例子,初学者很容易懂,主要是多线程处理数据,发回ui 线程去显示,防止单线程时,数据量大卡死
一些例子,多线程QT+OPENGL最基础版