最近、単純な opengl es 2.0 android アプリケーションの開発を開始しましたが、アニメーションの速度に問題があります。平均 fps は常に 60 (100 フレームごとに測定) ですが、アニメーションが非常に短時間途切れることがあります。単一の三角形がレンダリングされた場合でも発生します。アニメーションが進行するときに割り当てを行わず、アニメーション中に logcat に GC イベントがありません。
レンダリング ループで実行されるコード:
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 );
}
残りのコードは単純な GLSurfaceView と GLSurfaceView.Renderer です。
測定
デバッグ出力形式は次のとおりです。
D/FRAMERATE: 最後の 100 フレームの平均 fps
D/FRAMERATE: 最後の 100 フレームの最も遅いフレーム レンダリング時間
D/FRAMERATE: 最後の 100 フレームの最速フレーム レンダリング時間
測定ギャラクシー 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
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
ネイティブのndkコードを書く以外に解決策を見つけるのを手伝ってくれる人はいますか?