Parpadeo de la pantalla de OpenGL ES 2.0
Estoy enfrentando un gran problema. Estoy usando una pestaña Transformer tf101 con Android 4.0.3 en ella.
Mi aplicación utiliza una superficie personalizada de OpenGL ES 2.0. Estoy procesando múltiples planos con texturas. Estas texturas están cambiando aprox. 20 veces por segundo y se actualizan mediante el paso de arrays de bytes. Sin embargo, en ciertos casos, la pantalla comienza a parpadear y no procesa las nuevas texturas. Los elementos adicionales de la interfaz de usuario siguen respondiendo y realizan su trabajo según lo previsto. Parece que el contexto de OpenGL ignora todos los comandos y no responde.
- Android 3D objeto con la física
- Qué superficie utilizar para eglMakeCurrent para el contexto que sólo se convierte en FBOs
- Representación fuera de pantalla con PixelBuffer o FBO para guardar todos los gráficos en el mapa de bits (y luego en bmp / jpg) del tamaño deseado (> 4096) con OpenGL ES 2.0
- GLES20.glUniform4fv está dando GL_INVALID_OPERATION (1282)
- Añadir dinámicamente formas Opengl
Cuando esto sucede, aparecen unas pocas líneas en mi logCat:
08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit: NvError_IoctlFailed with error code 1
seguido por
08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit failed (err = 13, SyncPointValue = 879005, returning = 0)
Y algunos de ellos:
08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit failed (err = 196623, SyncPointValue = 0)
Aquí es cómo creo mi Plano Textured:
m_nTextureStorage[0] = 0; GLES20.glGenTextures( 1, m_nTextureStorage, 0); GLES20.glActiveTexture( GLES20.GL_TEXTURE0 ); GLES20.glBindTexture( GLES20.GL_TEXTURE_2D, m_nTextureStorage[ 0 ] ); // Set filtering GLES20.glTexParameterf( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST ); GLES20.glTexParameterf( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST ); GLES20.glTexParameteri( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE ); GLES20.glTexParameteri( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE );
Y aquí es cómo lo dibujo:
GLES20.glEnable(GLES20.GL_TEXTURE_2D); GLES20.glEnable(GLES20.GL_DEPTH_TEST); GLES20.glActiveTexture( GLES20.GL_TEXTURE0 ); //GLES20.glUniformMatrix4fv(m_HMVPMatrixUniform, 1, false, mvpMatrix, 0); GLES20.glUseProgram( m_nProgramHandle ); ByteBuffer oDataBuf = ByteBuffer.wrap( m_sTexture ); m_HTextureUniform = GLES20.glGetUniformLocation( m_nProgramHandle, "uTexture" ); m_HTextureCoordinate = GLES20.glGetAttribLocation( m_nProgramHandle, "TexCoordinate" ); GLES20.glUniform1iv( m_HTextureUniform, 2, m_nTextureStorage, 0 ); // get handle to the vertex shader's vPosition member m_nPositionHandle = GLES20.glGetAttribLocation( m_nProgramHandle, "vPosition" ); // Prepare the triangle data GLES20.glTexImage2D( GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, 640, 480, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, oDataBuf ); // Prepare the triangle data GLES20.glVertexAttribPointer( m_nPositionHandle, 3, GLES20.GL_FLOAT, false, 12, m_oVertexBuffer ); GLES20.glEnableVertexAttribArray( m_nPositionHandle ); GLES20.glVertexAttribPointer( m_HTextureCoordinate, 2, GLES20.GL_FLOAT, false, 12, m_oTextureBuffer); GLES20.glEnableVertexAttribArray( m_HTextureCoordinate ); m_nMVPMatrixHandle = GLES20.glGetUniformLocation( m_nProgramHandle, "uMVPMatrix"); // Apply the projection and view transformation GLES20.glUniformMatrix4fv( m_nMVPMatrixHandle, 1, false, mvpMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);
El procesador OpenGL simplemente llama a la función de dibujo de mi TexturedPlane pasando la mvpMatrix. Im que no suprime ninguna texturas desde que he leído que el sistema androide tomará el cuidado de eso automáticamente.
Creo que tiene algo que hacer con la GPU va OOM, pero no estoy seguro ya que no he encontrado nada relacionado con los mensajes de error publicado.
Gracias por adelantado!
ACTUALIZAR:
El Rendermode se estableció en RENDER_WHEN_DIRTY
. Después de RENDERMODE_CONTINOUSLY
a RENDERMODE_CONTINOUSLY
el problema desaparece .. Extraño. Ya que esto es sólo una solución y no hay solución, todavía estoy pidiendo ayuda;)
Dejar el Rendermode en continuamente no es una opción, ya que esto consume mucho tiempo del procesador y no tiene sentido, ya que la renderización sólo es necesaria cuando se generan nuevas texturas.
- EGL vs GLES 2.0 en Android (por ejemplo, Java)
- Android: los hilos no se ejecutan en paralelo
- Problemas con la cámara OpenGL ES 2.0
- ¿Hay algún dispositivo Android con un tamaño de pantalla mayor que GL_MAX_TEXTURE_SIZE?
- OpenGL ES 2.0 vs OpenGL 3 - Similitudes y diferencias
- Error "Permiso denegado" al instalar apk en el dispositivo
- GlCreateShader y glCreateProgram fallan en android
- Convertir la textura procesada de OpenGL ES 2.0 en mapa de bits y volver
Finalmente encontré la solución.
Cuando llamo a glFlush () después de cada círculo de renderizado, funciona bien. Yo no hacer que cada avión en un canal de textura diferente, funciona perfectamente hasta el momento. Gracias por la ayuda.
Cuando usted llama ..:
GLES20.glUniform1iv( m_HTextureUniform, 2, m_nTextureStorage, 0 );
Creo que une una unidad de textura particular al uniforme del muestreador . Pero usted está pasando un nombre de textura / objeto / handle / whatever (que no es una unidad de textura ). Tal vez es sólo una coincidencia, y sólo pasa en 0 (que es posiblemente el nombre de textura en m_nTextureStorage
), que es coincidentemente el Correcto / valor deseado?
O tal vez esto da lugar a la caída del conductor del espacio del usuario.
- ¿Cómo puedo cambiar un diálogo de progreso entre determinado e indeterminado?
- "FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS" afecta a getRootView (). GetHeight ()