2014-07-18 5 views
0

OpenGL 2.0에서 앱을 만들고 있는데 초당 ~ 20 프레임의 매우 낮은 FPS로 문제가 있습니다. 나는 무승부 모든에도 불구하고 새로운 개체를 만들어 :Android OpenGL 2.0 Low FPS

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,texture); 

     int mPositionHandle = 
      GLES20.glGetAttribLocation(riGraphicTools.sp_Image, "vPosition"); 

     GLES20.glEnableVertexAttribArray(mPositionHandle); 

     GLES20.glVertexAttribPointer(mPositionHandle, 3, 
            GLES20.GL_FLOAT, false, 
            0, vertexBuffer); 

     int mTexCoordLoc = GLES20.glGetAttribLocation(riGraphicTools.sp_Image, 
          "a_texCoord"); 

     GLES20.glEnableVertexAttribArray (mTexCoordLoc); 

     GLES20.glVertexAttribPointer (mTexCoordLoc, 2, GLES20.GL_FLOAT, 
        false, 
        0, uvBuffer); 

     int mtrxhandle = GLES20.glGetUniformLocation(riGraphicTools.sp_Image, 
         "uMVPMatrix"); 

     GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, m, 0); 

     int mSamplerLoc = GLES20.glGetUniformLocation (riGraphicTools.sp_Image, 
          "s_texture"); 

     GLES20.glUniform1i (mSamplerLoc, 0); 

     GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, 
       GLES20.GL_UNSIGNED_SHORT, drawListBuffer); 

     GLES20.glDisableVertexAttribArray(mPositionHandle); 
     GLES20.glDisableVertexAttribArray(mTexCoordLoc); 
     GLES20.glFlush(); 
     GLES20.glFinish(); 

지금, 내가 20frames에 대한 네 개의 스프라이트와 FPS를 가지고,하지만 난 버그가있을 것입니다 약 10 ~ 15 sprites.It를 추가하는거야.

+1

모든 스프라이트 뒤에'glFlush()'와'glFinish()'를 호출하지 마십시오. – dari

답변

1

실적에 도움이되는 여러 가지 요소가 있습니다. 간단한 항목의 부부와 함께 시작 : @dari는 지적

  1. 것은, 그 glFlush()glFinish() 호출을 없애. 당신은 그들을 거의 필요로하지 않아야합니다. 과도한 glFlush() 호출은 거의 항상 성능에 해를 끼치며 glFinish()은 실제로 매우 나쁩니다. 즉, OpenGL과 같은 그래픽 API의 주요 원칙 중 하나는 GPU가 CPU와 비동기 적으로 작동하도록한다는 것입니다. glFinish()은 병렬로 작업하는 대신 CPU와 GPU를 완전히 동기화합니다. 이는 매우 바람직하지 않습니다.

  2. 셰이더를 컴파일 한 후 glGetAttribLocation()glGetUniformLocation()을 모두 한 번 호출해야하며, 일반적으로 클래스의 멤버 변수에 위치를 저장해야합니다. 그런 다음 그릴 때마다 중복 전화를하는 대신 해당 변수의 값을 사용하십시오.

    mPositionLoc = GLES20.glGetAttribLocation(riGraphicTools.sp_Image, "vPosition"); 
    mMatrixLoc = GLES20.glGetUniformLocation(riGraphicTools.sp_Image, "uMVPMatrix"); 
    
    다음

    그릴 때, 당신은 당신의 속성과 유니폼을 설정하는 이러한 변수를 사용합니다 :

    당신이 쉐이더를 연결 한 후 예를 들어, 한 번, 당신은 mPositionLocmMatrixLoc 멤버 변수이 문을 실행
    GLES20.glEnableVertexAttribArray(mPositionLoc); 
    GLES20.glVertexAttribPointer(mPositionLoc, 3, 
              GLES20.GL_FLOAT, false, 
              0, vertexBuffer); 
    ... 
    GLES20.glUniformMatrix4fv(mMatricLoc, 1, false, m, 0); 
    

이 둘만으로 큰 발전을 이룰 수 있습니다. 이 외에도 VBO (Vertex Buffer Objects)를 사용해야합니다. 매번 glVertexAttribPointer()glDrawElements()에 전달하는 대신 정점 및 인덱스 데이터를 버퍼에 저장할 수 있습니다. 버텍스 데이터가 자주 변경되지 않으면 특히 유용합니다. 당신은 그것들을 사용하는 방법에 대한 많은 튜토리얼과 샘플 코드를 찾을 수 있어야합니다. glGenBuffers(), glBindBuffer() 등과 같은 API 호출을 사용합니다.

성능 목표를 달성하기에 충분하지 않은 경우, 모든 스프라이트에 대한 버텍스 데이터를 단일 버퍼에 저장하는 것이 좋습니다. 각각에 대한 별도의 버퍼 이렇게하면 glBindBuffer() 수만큼 glVertexAttribPointer()을 호출 할 필요가 없습니다.

+0

2. 언제나 코드 i 부분을 실행해야하며 시작 부분에서만 실행할 수있는 부분이 있습니다. – Filip

+1

몇 가지 예를 추가했습니다. –

+0

좋아, 1 단계와 2 단계를 이해하고 완료했다. 결과는 약 60FPS이다 : D 좋다. 버텍스 데이터를 자주 변경하기 때문에 VBO를 구현할 수 없습니다. [링크] (http://stackoverflow.com/questions/24844950/android-opengl2-0-intersection-between-two-textures) 도와 주실 수 있습니까? – Filip