2010-01-24 4 views
2

ES : 이전 응답에 Best approach for oldschool 2D zelda-like game안드로이드 OpenGL은이 질문에 다음과 같은 간단한 타일 발전기 성능 문제

감사를하고, http://insanitydesign.com/wp/projects/nehe-android-ports/에서 큰 영감, 난 내 간단한 2 차원 젤다 같은 게임 프로젝트에 대한 간단한 타일 생성기를 구축하기 시작 .

필자는 동일한 질감의 타일을 사용하여지도를 생성 할 수 있으며, 수평 및 수직 타일을 그리기 위해 2 개의 (.) 겹쳐진 반복을 사용하고 기본 DPAD 키 입력 수신기를 사용하여 x 및 y 축을 스크롤 할 수 있습니다.

하지만 이제는 첫 번째 성능 문제가 발생하여 하나의 텍스처와 하나의 모델 만 있습니다.

10x10지도를 만들려고 할 때 스크롤이 부드럽고 매끄 럽습니다.

50x50으로 시도하면 사태가 악화되고 100x100에서는 허용되지 않습니다.

내지도 세트의 '보이는'부분을 렌더링하고 숨겨진 타일을 무시하도록 OpenGL에 지시하는 방법이 있습니까? 나는 완전히 새로운이에요.

메신저 2D 스타일의 느낌 카메라와 관점을 설정

GLU.gluLookAt(gl, cameraPosX, cameraPosY, 10.0f,cameraPosX, cameraPosY, 0.0f, 0.0f, 1.0f, 0.0f); 

를 사용하여.

어떤 도움이 필요합니까? :)

for (int j = 0; j < 10; j++) { 

     for (int i = 0; i < 10; i++) { 

      gl.glPushMatrix(); // Sauvegarde la matrice sur le stack 

      //Bind the texture according to the set texture filter 
      gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[filter]); 
      //Set the face rotation 
      gl.glFrontFace(GL10.GL_CW); 
      //Enable texture state 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
      //Enable vertex state 
      gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
      //Point to our vertex buffer 
      gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
      //point to our texture buff 
      gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
      //Draw the vertices as triangle strip 
      gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 
      //Disable the client state before leaving 
      gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
      gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

      gl.glTranslatef(1.0f, 0.0f, 0.0f); // on avance d'une tile 
     } 
     // on va commencer a dessiner la 2e ligne 
     gl.glPopMatrix(); // Rappelle la matrice sur le stack 
     gl.glTranslatef(0.0f, -1.0f, 0.0f); 
    } 

답변

2

쉽게 보이는 아리아 만 그릴 수 있습니다. 다음은 수행해야 할 몇 가지 예입니다. 나는 안드로이드 API를 모른다. 그래서 내 예제를 메타 코드로 만든다.

+0

메타 아이디어가 나를 위해 일 해준 덕분에 :) – Dullahx

3

루프가 느려지는 이유는 OpenGL에서 많은 불필요한 작업을 수행하기 때문입니다. 중복 된 상태 변경이 많기 때문입니다.

즉, 아무런 효과가없는 매개 변수를 사용하여 gl 함수를 호출한다는 의미입니다. 이 함수를 호출하면 CPU 시간이 많이 걸리고 전체 OpenGL 파이프 라인이 매우 효과적으로 작동하지 않을 수 있기 때문에 정지 될 수 있습니다.

예를 들어, 사용하는 텍스처를 변경하려는 경우에만 glBindTexture를 호출해야합니다. 위의 코드는 내부 루프에서 동일한 텍스처를 반복적으로 묶습니다. 이는 매우 비쌉니다. 마찬가지로 내부 루프에서 텍스처 좌표 및 정점 배열을 활성화 및 비활성화 할 필요가 없습니다. 내부 루프의 텍스처 좌표 포인터와 정점 포인터를 설정하는 것조차도 후속 루프간에 변경되지 않으므로 불필요합니다.

결론은 내부 루프에서 번역을 변경하고 glDrawArrays 만 호출하면됩니다. 다른 모든 것은 단지 자원을 먹지 않습니다.

속도를 높이기 위해 할 수있는 고급 기능이 있습니다. 타일 ​​배경은 glDrawArrays (또는 glDrawElements)를 한 번만 호출하도록 그릴 수 있습니다. 관심이 있다면 일괄 처리 및 텍스처지도 책과 같은 Google 주제를 사용해야합니다.

관련 문제