2014-09-19 41 views
0

我将我的游戏移植到android,并决定使用NativeActivity而不是Java活动和JNI调用(我不避开JNI,只是设置回调会更方便并且opengl上下文创建/破坏纯粹在c/C++中)。保留通过本地代码创建的egl上下文

我知道GLSurfaceView有一个setPreserveEGLContextOnPause函数,但这是Java中的,而不是本机应用程序。创建我用下面的代码方面:

EGLConfig config; 
EGLSurface surface; 
EGLContext context; 

EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 

eglInitialize(display, 0, 0); 

eglChooseConfig(display, attribs, &config, 1, &numConfigs); 

eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); 
ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format); 

surface = eglCreateWindowSurface(display, config, engine->app->window, NULL); 

const EGLint contextAttribs[] = { 
     EGL_CONTEXT_CLIENT_VERSION, 2, 
     EGL_NONE 
}; 

context = eglCreateContext(display, config, NULL, contextAttribs); 

if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) { 
    ERR("Unable to eglMakeCurrent"); 
    return -1; 
} 

我也知道,setPreserveEGLContextOnPause是不是100%可靠的,我应该检查一下东西是手动销毁,但如果它不是 - 我想跳过资产重装部分为了更快的加载。

基本上我想要做的就是使用setPreserveEGLContextOnPause(或者它相当于ndk世界)。可能吗? GLSurfaceView是在android的egl调用的窗帘后面实例化的吗?

回答

1

GLSurfaceView是位于SurfaceView和GLES之上的Java语言实用程序类。 EGL没有创建或调用GLSurfaceView

GLSurfaceView中的“保留EGL上下文”代码存在,因为GLSurfaceView自己在渲染线程上管理EGL上下文。这个想法是设置的东西,所以如果它想要使用GLSurfaceView,应用程序不必处理它。如果你想做自己的EGL管理,请不要使用GLSurfaceView;当用Java编写代码时,您可以使用SurfaceViewTextureView代替。

您可以在Grafika中看到多个示例。 Java语言的GLES实现是本地实现的一个简单包装,因此Grafika中使用EGL的方式与您在本机代码中的使用方式密切相关。

如果您自己管理EGL上下文,则在活动拆除并重新创建时它不会消失,但如果该过程被终止,它将消失,因此最好在活动onPause()/onResume()上创建它。在应用程序处于后台时继续保持上下文(及其关联的纹理和缓冲区)也是一种糟糕的形式。有关SurfaceView和Activity生命周期交互的一些注意事项,请参见this article。 (如果您想了解Android图形体系结构的工作原理,请阅读文章的其余部分。)

+0

感谢您解决问题!我将手动管理我的上下文,然后根据设备功能销毁或保留它。 – 2014-09-19 18:10:36