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?