android - 无法在多线程 Android 应用程序上调用 glGenTextures

标签 android opengl-es android-ndk textures

我正在使用 Android NDK 制作一个 OpenGLES Android 应用程序,从 android 的 gljni 示例扩展,可以找到 here

它使用 GLSurfaceView。纹理在 GLSurfaceView.Renderer 的 onSurfaceChanged() 调用的 JNI 函数中初始化

当用户触摸屏幕时,应用程序需要更多纹理。为此,在 onTouchEvent() 中调用的 JNI 函数中调用 glGenTextures()。

问题在于线程 ID(gettid() 返回的)似乎完全是任意的,并且并不总是与具有 OpenGL 上下文的线程 ID 相同。

如果在同一线程中调用 JNI 函数,它会加载并显示纹理,但如果在另一个线程上调用,则会失败。所以它的行为相当随机。

我可以做这样的事情:

  • 共享 OpenGL 上下文,以便我可以在任何线程上成功调用 glGenTextures()。

  • 仅在一个具有 OpenGl 上下文的线程中调用 onTouchEvent()

  • 或者任何我可以让它工作的东西

谢谢

最佳答案

这不是随机行为,这就是 OpenGL 与线程交互的方式。上下文仅在一个线程上有效,其他线程没有 GL 上下文,除非您专门为要与 OpenGL 一起使用的每个线程创建一个上下文。如果没有上下文,所有 GL 调用都会失败。

关于android - 无法在多线程 Android 应用程序上调用 glGenTextures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3527878/

相关文章:

android - Intent (getApplicationContext(),类)和 Intent (类)之间有什么区别

java - 从 Spinner OnItemSelectedListener 事件中获取先前选择的项目

android - 带 opengles 的经纱纹理

ios - iPhone增强现实欧拉角旋转-滚动问题

java - 如何扩展两类 Android Activity ?

Android HttpUrlConnection getInputStream 抛出 NullPointerException

ios - GLES2.0 上的 VBO glDrawElements 和 glVertexAttribPointer 什么都不显示

android - 如何从 native 代码强制打开 Android 软键盘?

Android Tesseract 应用程序在 OCR 功能上崩溃

android - NDK 和 Java MediaCodec api 哪个延迟最低?