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.

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.

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.

  • Irrlicht android en opengl es 2.0 driver
  • Opengl es 2.0 dibujar superposición de mapa de bits en vídeo
  • For-loop en código de sombreado que trabaja con un número codificado pero no con una variable uniforme
  • La línea de dibujo de OpenGL ES 2.0 basada en movimiento, Line comienza siempre en origen
  • Android Opengl FBO fuera de la pantalla
  • Falta biblioteca para glShaderModel en mi programa nativo de C ++ para Android
  • Aprenda OpenGL: ¿por dónde empezar o cómo ha aprendido OpenGL?
  • ¿Dónde se especifica cómo OpenGL ES 2.0 representa los valores de textura flotante en el fragmento shader?
  • Escena de OpenGL con fondo transparente + widgets nativos por debajo y por encima
  • Cómo renderizar la imagen de la cámara YUV-NV21 de Android en el fondo en libgdx con OpenGLES 2.0 en tiempo real?
  • Vertex Shader no puede compilar. No puedo encontrar el error
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.