Cómo forzar el modo de paisaje con NDK utilizando códigos C ++ puros

En general, funciona bien. Pero si bloqueo la pantalla, y esperar APP_CMD_LOST_FOCUS ocurren, y luego desbloqueo el srceen. ¡Cambia a retrato! Pero yo encuentro el buff del egl sigue siendo ajuste del paisaje, y todo el coordenada más grande.

Mi configuración de AndroidManifest.xml:

<activity android:name="android.app.NativeActivity" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:configChanges="orientation|keyboardHidden" android:screenOrientation="landscape" android:clearTaskOnLaunch="true"> <meta-data android:name="android.app.lib_name" android:value="sunred" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

Mi código init cgl de egl

 int engine_init_display(OSCONTEXTENGINE* pEngine, const DISPLAY_CONFIG* pConfig) { // initialize OpenGL ES and EGL /* * Here specify the attributes of the desired configuration. * Below, we select an EGLConfig with at least 8 bits per color * component compatible with on-screen windows */ const EGLint attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_NONE }; EGLint w, h, dummy, format; EGLint numConfigs; EGLConfig config; EGLSurface surface; EGLContext context; EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(display, 0, 0); //eglBindAPI(EGL_OPENGL_ES_API); /* Here, the application chooses the configuration it desires. In this * sample, we have a very simplified selection process, where we pick * the first EGLConfig that matches our criteria */ EGLBoolean bres = eglChooseConfig(display, attribs, &config, 1, &numConfigs); if (!bres) { __android_log_print(LOGINFO_ERROR, "engine_init_display", "numConfigs = %d", numConfigs); } /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is * guaranteed to be accepted by ANativeWindow_setBuffersGeometry(). * As soon as we picked a EGLConfig, we can safely reconfigure the * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */ eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); ANativeWindow_setBuffersGeometry(pEngine->m_app->window, 0, 0, format); surface = eglCreateWindowSurface(display, config, pEngine->m_app->window, NULL); const EGLint ai32ContextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; context = eglCreateContext(display, config, NULL, ai32ContextAttribs); if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) { LOGW("Unable to eglMakeCurrent"); return P_ERR; } eglQuerySurface(display, surface, EGL_WIDTH, &w); eglQuerySurface(display, surface, EGL_HEIGHT, &h); pEngine->m_EglDisplay = display; pEngine->m_EglContext = context; pEngine->m_EglSurface = surface; pEngine->m_iWidth = w; pEngine->m_iHeight = h; return 0; } 

Cuando se produce APP_CMD_INIT_WINDOW, llamo engine_init_display.

Tiene algún método para obligar a establecerlo en el modo de paisaje con c + +?

El marco de renderizado:

Funciona bien

 pEngine->m_iWidth = 960; pEngine->m_iHeight = 540; 

Lock screeen -> APP_CMD_LOST_FOCUS -> desbloqueo de la pantalla

 pEngine->m_iWidth = 540; pEngine->m_iHeight = 960; 

Las ventanas cambian al retrato! Pero el buff del egl sigue siendo ajuste del paisaje, y todo el coordenada más grande.

One Solution collect form web for “Cómo forzar el modo de paisaje con NDK utilizando códigos C ++ puros”

Cuando obtenga APP_CMD_CONFIG_CHANGED, intente hacer otro init:

  case APP_CMD_CONFIG_CHANGED: if (engine->app->window != NULL && ((engine->width != ANativeWindow_getWidth(app->window)) || (engine->height != ANativeWindow_getHeight(app->window)))) { engine_handle_cmd(app, APP_CMD_TERM_WINDOW); engine_handle_cmd(app, APP_CMD_INIT_WINDOW); } break; 

(Nombres de variables, etc. del código de ejemplo de NativeActivity.) Usted terminará pasando por init varias veces en wake; Si esto es un problema, también puede hacer init lento e invalidar la configuración en APP_CMD_CONFIG_CHANGED y APP_CMD_INIT_WINDOW.

Esto es del código vivo; En nuestras pruebas, funciona cerca del 99% del tiempo en 2.3 y posteriores (no probado antes), pero una cantidad muy pequeña del tiempo que inicia el programa desde la pantalla de bloqueo y luego desbloquear provoca una condición de competencia en la que CONFIG_CHANGED no se llama Y nos despertamos atascados en el paisaje. Para nuestro juego, esto no es una ruta de código de usuario (que se inicia desde la pantalla de bloqueo), así que no he investigado más.

  • ¿Dónde se especifica cómo OpenGL ES 2.0 representa los valores de textura flotante en el fragmento shader?
  • GLSurfaceView - cómo hacer el fondo translúcido
  • La textura de OpenGL no sigue la geometría
  • ¿Es posible renderizar / sombrear diferido con OpenGL ES 2.0?
  • Dónde almacenar código de sombreado en la aplicación para Android
  • Optimización de un dibujo VBO enorme en dispositivos Android / iOS
  • Traducción después de la rotación
  • Bajo rendimiento al ejecutar eglSwapBuffer y eglMakeCurrent
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.