【问题标题】:Preserving egl context, created via native code保留 egl 上下文,通过本机代码创建
【发布时间】:2014-11-14 03:44:16
【问题描述】:

我正在将我的游戏移植到 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 调用背后被实例化?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    如果你自己管理EGL上下文,当Activity被拆除并重新创建时它不会消失,但如果进程被杀死它会消失,所以最好在活动onPause()/@987654333上创建它@。在应用程序处于后台时继续保持上下文(及其关联的纹理和缓冲区)也是一种不好的形式。有关使用表面的一些说明,请参阅 SurfaceView 和 Activity 生命周期交互的this article。 (如果您想了解 Android 图形架构的工作原理,请阅读本文的其余部分。)

    【讨论】:

    • 感谢您解决问题!我将手动管理我的上下文,然后根据设备功能销毁或保留它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2011-05-31
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多