我将我的游戏移植到android并决定使用NativeActivity而不是Java活动和JNI调用(我不是在避免使用JNI,只是在c中设置回调和opengl上下文创建/破坏会更方便/ C ++)。
我知道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调用窗帘后实例化的吗?
答案 0 :(得分:1)
GLSurfaceView
是一个Java语言实用程序类,位于SurfaceView
和GLES之上。没有任何东西是从EGL创建或调用GLSurfaceView
。
"保留EGL上下文" GLSurfaceView
中的代码存在,因为GLSurfaceView
在渲染线程上自己管理EGL上下文。我们的想法是设置内容,以便在想要使用GLSurfaceView
时应用程序不必处理它。如果您想进行自己的EGL管理,请不要使用GLSurfaceView
;在用Java编写代码时,您需要使用SurfaceView
或TextureView
。
您可以在Grafika中看到多个示例。 Java语言GLES实现是本机实现的一个薄包装器,因此Grafika中使用EGL的方式与您在本机代码中使用它的方式密切相关。
如果您自己管理EGL上下文,当活动被拆除并重新创建时它不会消失,但如果该过程被终止,它将会消失,因此最好在活动{{}上创建它。 1}} / onPause()
。当应用程序在后台时,继续保持上下文(及其相关的纹理和缓冲区)也是一种不好的形式。有关使用曲面的一些注意事项,请参阅SurfaceView和Activity生命周期交互的this article。 (如果您想了解Android图形架构的工作原理,请阅读本文的其余部分。)