调用没有当前上下文的OpenGL ES API(每个线程记录一次) - OpenGL ES

时间:2016-01-17 03:42:56

标签: android multithreading opengl-es

我真的需要有人帮助了解我所面临的问题。我试图从以下行获取GPU信息:

renderer = GLES20.glGetString(GLES20.GL_RENDERER);

vendor = GLES20.glGetString(GLES20.GL_VENDOR);

version = GLES20.glGetString(GLES20.GL_VERSION);

如果我从" OnCreate"执行这些行。我接收错误的活动方法" E / libEGL(4380):调用没有当前上下文的OpenGL ES API(每个线程记录一次)"在logcat中返回空值。

但是,如果我通过按钮执行这些行,请点击我收到结果。

你能否帮助我确定我在做什么错误,或者我还有其他需要学习的事情吗?

如果从onCreate方法执行,我如何获得结果?

1 个答案:

答案 0 :(得分:2)

问题正是错误消息告诉您的:您在没有当前OpenGL上下文的情况下尝试进行OpenGL调用(glGetString)。 OpenGL调用需要您正在进行调用的线程中的当前上下文。

OpenGL的典型用法包括使用GLSurfaceView,它负责创建上下文并使其成为当前的。如果您确实需要从代码中的其他位置进行OpenGL调用,则需要自己创建一个OpenGL上下文。这是使用EGL10EGL14类完成的。您可以在我的答案中找到完整的代码:GLES10.glGetIntegerv returns 0 in Lollipop only

为什么它从按钮单击处理程序起作用不太清楚。似乎至少某些版本的Android有一个" stray"在某些情况下恰好是当前的OpenGL上下文。不过,我不会指望这一点始终如一。例如,正如你在上面提到的问题中所看到的,当一些人停止在棒棒糖上工作时,有些人因为依赖它而被烧毁。