OpenGL ES 2.0屏幕闪烁

我面临一个大问题。 我正在使用Android 4.0.3上的Transformer tf101标签。

我的应用程序使用自定义的OpenGL ES 2.0表面。 我用纹理渲染多个飞机。 这个纹理正在改变。 每秒20次,并通过传递字节数组进行更新。 但是,在某些情况下,屏幕开始闪烁,不会渲染新的纹理。 额外的UI元素仍然是响应式的,并按预期工作。 看来OpenGL上下文忽略了所有的命令,并且没有响应。

发生这种情况时,我的logCat中会显示几行:

08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit: NvError_IoctlFailed with error code 1 

其次是

 08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit failed (err = 13, SyncPointValue = 879005, returning = 0) 

其中几个:

 08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit failed (err = 196623, SyncPointValue = 0) 

这是我如何创build我的纹理飞机:

  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 ); 

这里是我如何画它:

 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); 

OpenGL渲染器只需通过传递mvpMatrix来调用我的TexturedPlane的绘图函数。 我不删除任何纹理,因为我已经读了android系统将自动照顾。

我认为它与GPU进行OOM有些待办事项,但我不知道,因为我还没有find任何与发布的错误消息相关的东西。

感谢它推进!

更新:

Rendermode被设置为RENDER_WHEN_DIRTY 。 将其更改为RENDERMODE_CONTINOUSLY ,问题消失..奇怪。 由于这只是一个解决方法,没有解决scheme,所以我仍然在寻求帮助;)

离开渲染模式是不行的,因为这会消耗大量的处理器时间并且没有意义,因为只有在生成新纹理时才需要渲染。

Solutions Collecting From Web of "OpenGL ES 2.0屏幕闪烁"

终于find了解决办法。

当我在每个渲染循环之后调用glFlush()时,它都可以正常工作。 我没有在不同的纹理通道渲染每一架飞机,它迄今为止完美的作品。 谢谢您的帮助。

你打电话时 ..:

 GLES20.glUniform1iv( m_HTextureUniform, 2, m_nTextureStorage, 0 ); 

我认为将一个特定的纹理单元绑定到采样器制服上 。 但是你正在传递一个纹理名称/对象/句柄/任何东西(这不是一个纹理单元) 。也许这只是巧合,而且你只能传入0(这可能是m_nTextureStorage的纹理名称)正确/理想的价值?

或者,也许这会导致用户空间的驱动程序崩溃。