5

recently I started developing some simple opengl es 2.0 android application and i've got problem with animation speed. Average fps is constantly equal to 60 (measured every 100 frames) but sometimes animation stutters for a very short period of time. It happens even when single triangle is rendered. I make no allocations when animation goes on and there are no GC events in logcat during animation.

Code executed in render loop:

public void draw( GLFloatBuffer positionBuffer, int positionBufferOffset, int trianglesCount )
{
    GLES20.glUseProgram( activeGLProgram.glProgramId );

    // Set mvpMatrixValue
    int u_MvpMatrixLocation = GLES20.glGetUniformLocation( activeGLProgram.glProgramId, U_MVP_MATRIX_NAME );
    GLES20.glUniformMatrix4fv( u_MvpMatrixLocation, 1, false, mvpMatrix, 0 );

    // Set vertex position stream
    int a_VertexPositionLocation = GLES20.glGetAttribLocation( activeGLProgram.glProgramId, A_VERTEX_POSITION_NAME );
    GLES20.glBindBuffer( GLES20.GL_ARRAY_BUFFER, positionBuffer.glBufferId );
    GLES20.glEnableVertexAttribArray( a_VertexPositionLocation );

    GLES20.glVertexAttribPointer( a_VertexPositionLocation, POSITION_COORDINATES_PER_VERTEX,
                                  GLES20.GL_FLOAT, false,
                                  0, positionBufferOffset * GLUtilities.BYTES_PER_FLOAT );

    // Draw shape
    GLES20.glDrawArrays( GLES20.GL_TRIANGLES, 0, trianglesCount * 3 );

    // Clear state
    GLES20.glDisableVertexAttribArray( a_VertexPositionLocation );
    GLES20.glBindBuffer( GLES20.GL_ARRAY_BUFFER, 0 );
}

The rest of the code is simple GLSurfaceView and GLSurfaceView.Renderer

Measurements

Debug output format is:

D/FRAMERATE: Average fps for last 100 frames

D/FRAMERATE: Slowest frame render time for last 100 frames

D/FRAMERATE: Quickest frame render time for last 100 frames

Measurements Galaxy S II:

D/FRAMERATE:(24052): 59.018566
D/FRAMERATE:(24052): maxTimeDiff = 77ms <----
D/FRAMERATE:(24052): minTimeDiff = 3ms
D/FRAMERATE:(24052): 59.900166
D/FRAMERATE:(24052): maxTimeDiff = 24ms
D/FRAMERATE:(24052): minTimeDiff = 10ms
D/FRAMERATE:(24052): 59.780804
D/FRAMERATE:(24052): maxTimeDiff = 28ms
D/FRAMERATE:(24052): minTimeDiff = 10ms
D/FRAMERATE:(24052): 59.4882
D/FRAMERATE:(24052): maxTimeDiff = 32ms
D/FRAMERATE:(24052): minTimeDiff = 3ms
D/FRAMERATE:(24052): 59.840427
D/FRAMERATE:(24052): maxTimeDiff = 24ms
D/FRAMERATE:(24052): minTimeDiff = 9ms
D/FRAMERATE:(24052): 59.920105
D/FRAMERATE:(24052): maxTimeDiff = 22ms
D/FRAMERATE:(24052): minTimeDiff = 12ms
.
.
.
D/FRAMERATE:(24052): 59.116573
D/FRAMERATE:(24052): maxTimeDiff = 68 <--- Here it happend again
D/FRAMERATE:(24052): minTimeDiff = 8

It looks like problem doesnt appear on HTC Desire Z:

D/FRAMERATE: (28788): maxTimeDiff = 20ms
D/FRAMERATE: (28788): minTimeDiff = 15ms
D/FRAMERATE: (28788): 58.27506
D/FRAMERATE: (28788): maxTimeDiff = 22ms
D/FRAMERATE: (28788): minTimeDiff = 12ms
D/FRAMERATE: (28788): 58.27506
D/FRAMERATE: (28788): maxTimeDiff = 22ms
D/FRAMERATE: (28788): minTimeDiff = 14ms
D/FRAMERATE: (28788): 58.27506
D/FRAMERATE: (28788): maxTimeDiff = 20ms
D/FRAMERATE: (28788): minTimeDiff = 14ms

Can anyone help with finding solution other than writing native ndk code?

piotrekg2
  • 1,237
  • 11
  • 21
  • Hi, I'm having similar problems (http://stackoverflow.com/questions/28780460/android-gpu-profiling-opengl-live-wallpaper-is-slow). Did you run the GPU profiler? Was curious if it would look the same. – Victor Sand Mar 04 '15 at 10:06
  • @VictorSand No I did not. I have stopped working on this. Please let me know if you find out something about this. – piotrekg2 Mar 04 '15 at 12:51

0 Answers0