保留通过本地代码创建的egl上下文
我将我的游戏移植到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调用的窗帘后面实例化的吗?
GLSurfaceView
是位于SurfaceView
和GLES之上的Java语言实用程序类。 EGL没有创建或调用GLSurfaceView
。
GLSurfaceView
中的“保留EGL上下文”代码存在,因为GLSurfaceView
自己在渲染线程上管理EGL上下文。这个想法是设置的东西,所以如果它想要使用GLSurfaceView
,应用程序不必处理它。如果你想做自己的EGL管理,请不要使用GLSurfaceView
;当用Java编写代码时,您可以使用SurfaceView
或TextureView
代替。
您可以在Grafika中看到多个示例。 Java语言的GLES实现是本地实现的一个简单包装,因此Grafika中使用EGL的方式与您在本机代码中的使用方式密切相关。
如果您自己管理EGL上下文,则在活动拆除并重新创建时它不会消失,但如果该过程被终止,它将消失,因此最好在活动onPause()
/onResume()
上创建它。在应用程序处于后台时继续保持上下文(及其关联的纹理和缓冲区)也是一种糟糕的形式。有关SurfaceView和Activity生命周期交互的一些注意事项,请参见this article。 (如果您想了解Android图形体系结构的工作原理,请阅读文章的其余部分。)
感谢您解决问题!我将手动管理我的上下文,然后根据设备功能销毁或保留它。 – 2014-09-19 18:10:36