Can';t在多线程android应用程序上调用glGenTextures
我正在使用安卓NDK制作一个OpenGLES安卓应用程序,扩展安卓的gljni示例,可以找到 它正在使用GLSurfaceView。纹理在从GLSurfaceView.Renderer的onSurfaceChanged()调用的JNI函数中初始化 当用户触摸屏幕时,应用程序需要更多的纹理。为此,在onTouchEvent()中调用的JNI函数中调用了glGenTextures() 问题在于线程id(getId()返回的)似乎完全是任意的,并且与具有OpenGL上下文的线程id并不总是相同的 如果在同一个线程中调用JNI函数,它将加载并显示纹理,但如果在另一个线程中调用JNI函数,它将失败。所以它的行为非常随机 我可以做一些类似于:Can';t在多线程android应用程序上调用glGenTextures,android,opengl-es,android-ndk,textures,Android,Opengl Es,Android Ndk,Textures,我正在使用安卓NDK制作一个OpenGLES安卓应用程序,扩展安卓的gljni示例,可以找到 它正在使用GLSurfaceView。纹理在从GLSurfaceView.Renderer的onSurfaceChanged()调用的JNI函数中初始化 当用户触摸屏幕时,应用程序需要更多的纹理。为此,在onTouchEvent()中调用的JNI函数中调用了glGenTextures() 问题在于线程id(getId()返回的)似乎完全是任意的,并且与具有OpenGL上下文的线程id并不总是相同的 如果
- 共享OpenGL上下文,这样我就可以在任何线程上成功调用glGenTextures()
- 使onTouchEvent()仅在一个具有OpenGl上下文的线程中调用
- 或者任何我能让它工作的东西
谢谢我还没有使用NDK和OpenGL。但是对于纯Java版本,您不能共享线程。GLSurfaceView不喜欢在线程之间共享GL上下文。原因是(从我所知道的)调用drawFrame()后,上下文会丢失。如果您尝试在onSurfaceCreated、onSurfaceChanged或onDrawFrame()之外使用该上下文,则GL方法将无法工作。因此,对于另一个线程,当另一个线程执行时,GL线程很可能已经完成其drawFrame()方法,从而使上下文无效。我使用GLSurfaceView.queueEvent()使其工作 文档中说GLSURFACHEVIEW在分离UI线程和渲染线程时非常小心,并且
queueEvent()使代码在其呈现线程中运行。这不是随机行为,这是OpenGL与线程交互的方式。上下文仅在一个线程上是当前的,其他线程没有GL上下文,除非您专门为要与OpenGL一起使用的每个线程创建上下文。如果没有上下文,所有GL调用都会失败。我介绍了一种仅用于在单独线程上上载纹理的java解决方案,作为对另一个问题的回答:
它应该与NDK非常相似。NDK版本在这方面与OpenGL版本相同。