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

时间:2014-09-19 13:59:26

标签: android c++ android-ndk java-native-interface opengl-es-2.0

我将我的游戏移植到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调用窗帘后实例化的吗?

1 个答案:

答案 0 :(得分:1)

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

"保留EGL上下文" GLSurfaceView中的代码存在,因为GLSurfaceView在渲染线程上自己管理EGL上下文。我们的想法是设置内容,以便在想要使用GLSurfaceView时应用程序不必处理它。如果您想进行自己的EGL管理,请不要使用GLSurfaceView;在用Java编写代码时,您需要使用SurfaceViewTextureView

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

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