Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在多线程android应用程序上调用glGenTextures_Android_Opengl Es_Android Ndk_Textures - Fatal编程技术网

Can';t在多线程android应用程序上调用glGenTextures

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并不总是相同的 如果

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

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

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

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

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

我可以做一些类似于:

  • 共享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版本相同。