Android GLSurfaceView.queueEvent不在GL线程中执行

Android GLSurfaceView.queueEvent不在GL线程中执行,android,opengl-es,Android,Opengl Es,我正试图从我的主要活动中为我的GLSURFACHEVIEW执行一些OpenGL命令。由于OpenGL渲染器在自己的线程中工作,据我所知,我必须使用queueEvent 我正在使用GLSURFACHEVIEW中的以下代码调用queueEvent: queueEvent(new Runnable(){ @Override public void run() { renderer.doSomething(data); //executes some OpenGL

我正试图从我的主要活动中为我的GLSURFACHEVIEW执行一些OpenGL命令。由于OpenGL渲染器在自己的线程中工作,据我所知,我必须使用
queueEvent

我正在使用GLSURFACHEVIEW中的以下代码调用
queueEvent

queueEvent(new Runnable(){
     @Override
     public void run() {
          renderer.doSomething(data); //executes some OpenGL commands
          requestRender();
}});
doSomething()
方法绑定纹理并编译着色器

这是行不通的
glCreateProgram
返回
0
,例如,在GL线程之外执行GL命令时会发生这种情况。如果在渲染器中执行,同样的代码也可以正常工作。因此,我使用
queueEvent
执行的命令似乎不是在GL上下文中执行的,而是在错误的线程中执行的


我的理解是调用
queueEvent
足以在GL线程内执行错误的代码吗?还有什么我必须做的,或者我现在如何调用它有任何错误吗?

它做了一些实验,在某些情况下,似乎queueEvent将在实际调用onSurfaceCreated之前执行Runnable,尽管仍然在GL线程上。 如果在“活动”中的onResume之后立即使用queueEvent,则可能会发生这种情况

我用glClearColor做了这个实验,尽管它毫无例外地调用了这个命令,但背景并没有改变。可能GLContext仍然不可用,并且命令什么也不做


希望这有帮助

使用
Runnable
接口是否意味着您希望该类的每个实例都在单独的线程中运行
Runnable.run(…)
是创建新线程时调用的方法。@AndonM.Coleman我不确定是否正确理解您的意思。我想在
Runnable.run
中运行代码,以在特定线程(GL线程)中运行。根据,queueEvent应该在渲染器线程中运行Runnable。@AndonM.Coleman-在本例中不是这样。runnable仅仅是您需要包装代码的内容,以便将其传递给以后的执行。queueEvent接受该runnable,并在现有的renderer thread.FWIW上运行它。如果您不确定运行的是哪个线程代码,请在其中设置断点。检查调用堆栈,并观察当前线程是什么。@NewbieandQuir奇-不,每个surfaceview只有一个渲染器线程-Android创建它,而不是您。如果您想进行将用于构建渲染内容的重要计算,您可以在不同的线程中进行,但对该视图的所有GL调用必须在提供的渲染线程上完成(在您自己的后台线程上完成昂贵的工作后,使用描述结果的数据调用
queueEvent
)“疯狂的科学家”我同意Momchil的观点;听起来代码运行得太早了。可能需要让onSurfaceCreated设置一个标志,并在runnable中检查是否已设置该标志。如果未设置,则将其重新排队。或者在调用queueEvent之前,当仍在主线程中时,如果未设置该标志,则使用带有postDelayed的处理程序(在主线程的循环器上声明)以允许时间流逝。保持延迟,直到可以安全地调用queueEvent(已设置标志,指示已创建曲面)。