gpt4 book ai didi

android - OpenGL ES 2.0 屏幕闪烁

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:02 26 4
gpt4 key购买 nike

我遇到了一个大问题。我正在使用带有 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)

这是我创建纹理平面的方法:

    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 有一定关系,但我不确定,因为我没有发现与发布的错误消息相关的任何内容。

提前致谢!

更新:

渲染模式设置为 RENDER_WHEN_DIRTY 。将其更改为 RENDERMODE_CONTINOUSLY 后,问题就消失了。很奇怪。由于这只是一种解决方法,没有解决方案,我仍在寻求帮助;)

将渲染模式保持在连续状态是没有选择的,因为这会消耗大量处理器时间并且没有任何意义,因为只有在生成新纹理时才需要渲染。

最佳答案

终于找到了解决方案。

当我在每个渲染圈之后调用 glFlush() 时,它工作正常。我没有在不同的纹理 channel 上渲染每个平面,到目前为止它工作得很好。感谢您的帮助。

关于android - OpenGL ES 2.0 屏幕闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12034436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com