保留EGL情境中,通过原生代码创建(Preserving egl context, created

2019-10-21 00:11发布

我端起我的游戏到Android和决定去与NativeActivity的,而不是Java的活动和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的世界)。 可能吗? 被GLSurfaceView被实例化的Android的EGL调用窗帘后面?

Answer 1:

GLSurfaceView是Java语言的工具类,它的顶部位于SurfaceView和GLES。 没有什么是创建或调入GLSurfaceView从EGL。

在“保存EGL语境”代码GLSurfaceView存在是因为GLSurfaceView做渲染线程上的EGL上下文的自身管理。 当时的想法是设定让应用程序没有,如果它想用来对付它GLSurfaceView 。 如果你想要做自己的EGL管理,不使用GLSurfaceView ; 用Java编写代码时,你会使用SurfaceViewTextureView代替。

你可以看到在多个例子Grafika 。 Java语言GLES实现绕机实现薄的包装,所以EGL在Grafika使用方式密切反映你将如何使用它在本地代码。

如果您自行管理EGL情况下,它不会消失,当活动被拆除和重建,但如果进程被杀死它会自动消失,所以最好对活动创建它onPause() / onResume() 这也是坏的形式继续持股上下文(及其关联的纹理和缓冲区),而应用程序是在后台。 参见本文关于与表面工作的SurfaceView和活动周期互作一些笔记。 (阅读这篇文章的其余部分,如果你想了解Android的图形架构是如何工作的。)



文章来源: Preserving egl context, created via native code