`
yidongkaifa
  • 浏览: 4051806 次
文章分类
社区版块
存档分类
最新评论

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中,就好啦~~

问题解决。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics