DBMNG数据库管理与应用

科学是实事求是的学问,来不得半点虚假。
当前位置:首页 > 移动应用 > Android

AndroidOpenGL中的线程问题calltoOpenGLESAPIwithnocurrentcontext(loggedonceperthread)

Android OpenGL中的线程问题call to OpenGL ES API with no current context (logged once per thread)

用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。一时犯傻啊,既然系统设计了线程隔离机制,一定也会提供线程通信的方法喽!如下:


[java] view plaincopy
  1. GLSurfaceView.queueEvent(Runnable r);  

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


问题解决。

本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号