2014-09-19 70 views
0

我將我的遊戲移植到android,並決定使用NativeActivity而不是Java活動和JNI調用(我不避開JNI,只是設置回調會更方便並且opengl上下文創建/破壞純粹在c/C++中)。保留通過本地代碼創建的egl上下文

我知道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

GLSurfaceView是位於SurfaceView和GLES之上的Java語言實用程序類。 EGL沒有創建或調用GLSurfaceView

GLSurfaceView中的「保留EGL上下文」代碼存在,因爲GLSurfaceView自己在渲染線程上管理EGL上下文。這個想法是設置的東西,所以如果它想要使用GLSurfaceView,應用程序不必處理它。如果你想做自己的EGL管理,請不要使用GLSurfaceView;當用Java編寫代碼時,您可以使用SurfaceViewTextureView代替。

您可以在Grafika中看到多個示例。 Java語言的GLES實現是本地實現的一個簡單包裝,因此Grafika中使用EGL的方式與您在本機代碼中的使用方式密切相關。

如果您自己管理EGL上下文,則在活動拆除並重新創建時它不會消失,但如果該過程被終止,它將消失,因此最好在活動onPause()/onResume()上創建它。在應用程序處於後臺時繼續保持上下文(及其關聯的紋理和緩衝區)也是一種糟糕的形式。有關SurfaceView和Activity生命週期交互的一些注意事項,請參見this article。 (如果您想了解Android圖形體系結構的工作原理,請閱讀文章的其餘部分。)

+0

感謝您解決問題!我將手動管理我的上下文,然後根據設備功能銷燬或保留它。 – 2014-09-19 18:10:36