Haf*_*uss 9 android 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
Run Code Online (Sandbox Code Playgroud)
其次是
08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit failed (err = 13, SyncPointValue = 879005, returning = 0)
Run Code Online (Sandbox Code Playgroud)
以及其中一些:
08-20 10:31:15.390: D/NvOsDebugPrintf(2898): NvRmChannelSubmit failed (err = 196623, SyncPointValue = 0)
Run Code Online (Sandbox Code Playgroud)
这是我如何创建我的纹理平面:
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 );
Run Code Online (Sandbox Code Playgroud)
以下是我如何绘制它:
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);
Run Code Online (Sandbox Code Playgroud)
OpenGL Renderer通过传递mvpMatrix简单地调用我的TexturedPlane的draw函数.我没有删除任何纹理,因为我已经读过Android系统会自动处理它.
我认为它有一些关于GPU进入OOM的东西,但我不确定,因为我没有找到任何与发布的错误消息相关的内容.
谢谢它提前!
更新:
Rendermode设置为RENDER_WHEN_DIRTY
.改变它后RENDERMODE_CONTINOUSLY
,问题消失了......很奇怪.由于这只是一种解决方法而且没有解决方案,我仍然在寻求帮助;)
连续使用Rendermode是没有选择的,因为这会消耗很多处理器时间并且毫无意义,因为只有在生成新纹理时才需要渲染.
归档时间: |
|
查看次数: |
4119 次 |
最近记录: |