9

私は大きな問題に直面しています。Android4.0.3がインストールされたTransformertf101タブを使用しています。

私のアプリはカスタムOpenGLES2.0サーフェスを使用しています。テクスチャを使用して複数の平面をレンダリングしています。このテクスチャは約変化しています。1秒間に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になることと関係があると思いますが、投稿されたエラーメッセージに関連するものが見つからないため、わかりません。

よろしくお願いします!

アップデート:

Rendermodeはに設定されましたRENDER_WHEN_DIRTY。それを変更した後RENDERMODE_CONTINOUSLY、問題は消えます..奇妙な。これは単なる回避策であり、解決策ではないため、私はまだ助けを求めています;)

レンダリングモードを継続的に維持することはできません。これは、プロセッサ時間を大量に消費し、意味がないためです。レンダリングが必要になるのは、新しいテクスチャが生成されたときだけだからです。

4

2 に答える 2

3

最後に解決策を見つけました。

すべてのレンダリング サークルの後に glFlush() を呼び出すと、正常に動作します。すべてのプレーンを異なるテクスチャ チャネルでレンダリングするわけではありませんが、これまでのところ完全に機能しています。助けてくれてありがとう。

于 2012-09-17T08:23:38.043 に答える