Android 保留通过本机代码创建的egl上下文

Android 保留通过本机代码创建的egl上下文,android,c++,android-ndk,java-native-interface,opengl-es-2.0,Android,C++,Android Ndk,Java Native Interface,Opengl Es 2.0,我正在将我的游戏移植到android上,并决定使用NativeActivity,而不是Java activity和JNI调用(我不是在回避JNI,只是在c/c++中设置回调和opengl上下文创建/销毁会更方便) 我知道GLSurfaceView有一个setPreserveEGLContextOnPause函数,但这是Java中的函数,而不是本机应用程序中的函数。我使用以下代码创建上下文: EGLConfig config; EGLSurface surface; EGLContext cont

我正在将我的游戏移植到android上,并决定使用NativeActivity,而不是Java activity和JNI调用(我不是在回避JNI,只是在c/c++中设置回调和opengl上下文创建/销毁会更方便)

我知道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 world)。可能吗?GLSurfaceView是在安卓egl调用的幕后实例化的吗?

GLSurfaceView
是一个Java语言实用程序类,位于
SurfaceView
和GLES之上。没有任何内容从EGL创建或调用
GLSurfaceView

GLSurfaceView
中的“保留EGL上下文”代码存在,因为
GLSurfaceView
在渲染线程上自行管理EGL上下文。这个想法是为了让应用程序在想要使用
GLSurfaceView
时不必处理它。如果您想自己管理EGL,请不要使用
GLSurfaceView
;在用Java编写代码时,您应该使用
SurfaceView
TextureView

您可以在中看到多个示例。Java语言GLES实现是本机实现的一个薄包装器,因此在Grafika中使用EGL的方式与在本机代码中使用EGL的方式非常相似


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

感谢您的澄清!我将手动管理我的上下文,然后根据设备功能销毁或保留它。