Java OpenGLES在其他线程中预加载纹理

Java OpenGLES在其他线程中预加载纹理,java,c++,android,android-ndk,opengl-es-2.0,Java,C++,Android,Android Ndk,Opengl Es 2.0,我需要在OpenGLES应用程序的非主线程中预加载一些纹理。我读到这篇文章:但更多的是我需要的Java版本。如何告诉我的加载线程将纹理上传/创建到主循环中?我读了一些关于创建上下文的内容,并以某种方式与主上下文共享。如何实现?从资源/磁盘到GL渲染,有两个步骤可以实现纹理的获取,它们可以分开,以允许在工作线程上进行大部分加载和计算工作 第一步是在Java级别实际创建位图,它将使用类似BitmapFactory.decodeResource()的内容。这一部分可以在您喜欢的任何线程上完成,加载完成

我需要在OpenGLES应用程序的非主线程中预加载一些纹理。我读到这篇文章:但更多的是我需要的Java版本。如何告诉我的加载线程将纹理上传/创建到主循环中?我读了一些关于创建上下文的内容,并以某种方式与主上下文共享。如何实现?

从资源/磁盘到GL渲染,有两个步骤可以实现纹理的获取,它们可以分开,以允许在工作线程上进行大部分加载和计算工作

第一步是在Java级别实际创建位图,它将使用类似BitmapFactory.decodeResource()的内容。这一部分可以在您喜欢的任何线程上完成,加载完成后,您可以将位图放入ArrayList或队列或其他任何线程中。确保使用同步块包围列表的访问


第二步是调用glGenTextures,这必须在GL线程中完成。因此,在drawFrame()方法的开头,检查要将位图保存到的ArrayList的大小,如果大小大于0,则调用glGenTexures并从数组中删除并重新设置位图的样式。

他更愿意在
surfaceCreated()
中加载纹理,而不是在
drawFrame()中加载纹理
@Pompe de velo-如果要进行大量加载,可能需要向用户显示某种加载/进度指示器,并通过多个drawFrame()调用加载纹理。在surfaceCreated中执行所有加载操作(可能需要几秒钟或更长时间),可能会让人感觉到您的应用程序由于显示/UI无响应而挂起,甚至会导致ANR。不正确。如果延迟UI线程而不是渲染线程,则会发生ANR。但是,在
surfaceCreated()
中加载更有意义,因为这是进行一次性初始化的地方。但是,如果您要加载的不仅仅是一组微不足道的图像,那么显示进度指示器并跨多个调用drawFrame()来完成繁重的工作会更方便用户。这种方法也更加健壮,因为您可以在以后加载图像,而无需依赖将来对surfaceCreated()的调用。我不同意您的观点,但我相信您有自己的理由,而我有自己的理由。:-)祝您有个美好的一天!我描述了一个仅用于在单独线程上上载纹理的java解决方案,作为对另一个问题的回答: