2012-06-17 3 views
1

저는 얼마전 OpenGL을 프로그래밍 해 왔지만 OpenGL ES를 처음 접했습니다. 내가 겪고있는 문제 중 하나는 효율적인 매너로 화면에 프리미티브를 그리는 것입니다.Vertex Array 성능 문제

나는 동일한 라인의 수는 (다른 번역) 화면에 루프를 그릴 필요하고이 코드와 큰 성능 저하 발견 :

gl.glColor4f(0.5f, 0.5f, 0.5f, 1.0f); 
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, this.vertices); 

for (int j = 0; j < height; j++) 
{ 
    for (int i = 0; i < width; i++) 
    { 
     gl.glPushMatrix(); 

     gl.glTranslatef(i, j, 0); 
     gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4); 

     gl.glPopMatrix(); 
    } 
} 

나는 glDrawArrays이 나쁜 사람은 그 수치를 이리.

그래서 문제는 어떻게 효율적으로 라인 루프 묶음을 그릴 수 있습니까? GL_LINE_LOOP를 사용할 때 각 프리미티브에 대해 glDrawArrays를 호출해야하므로 GL_LINES로 유형을 변경해야합니까? 위의 코드에서 4 개의 꼭지점을 가진 버텍스 배열이 너비 * 높이 * 8 버텍스를 보유 할 것이므로 엄청난 메모리 낭비를 초래할 것입니다.

저는 Android OpenGL ES 1.1 용으로 프로그래밍하고 있습니다.

답변

1

여기 glDrawArrays는 나쁜 사람입니다.

예 아니오. 당신은 DrawArrays가 빠른 호출이 아니라고 말하고 있습니다 만, 자주 호출하지 않으면 무언가를 렌더링하는 가장 빠른 방법입니다.

그래서 유형을 GL_LINES (으)로 변경해야합니까? 당신은 1 무 호출

으로 모든 것을 그릴 수 있도록

예, 이것은 다음 폭을 개최 (4 개 정점을 잡고, 위의 코드에서) 정점 배열 때문에 큰 메모리 낭비를 부과 * 높이 * 8 정점.

단지 4 개의 정점과 비교할 때, 나는 당신이 그것을 메모 낭비로 볼 수 있다고 생각합니다. 그러나 GPU는 을 내장하여 한 번에 큰 배치를 렌더링하기 위해을 만들었습니다. 작은 배치를 많이 그리는 것에 대해 당신을 싫어할 것입니다.

또한 꼭지점을 고정 할만큼 충분한 메모리가 있어야합니다. 문제가되지 않아야합니다.

1

여기 glDrawArrays는 나쁜 사람입니다.

나쁜 사람은 함수 호출/컨텍스트 전환 예산의 비효율적 인 사용입니다. 모든 라인을 하나의 배열 (GL_LINES)로 묶어 GPU로 한 번의 호출로 전송하십시오. 어쨌든 하나의 페이지 (일반적으로 4KB)를 할당 할 수 없으므로 메모리를 낭비하지 않습니다.

+0

"하나의 페이지를 할당 할 수 없습니까?" 버텍스 배열이 클라이언트 측에 할당되어 있지 않습니까? –

+0

@ JensÅkerblom : 네 그렇습니다. 클라이언트 측은 Android 커널을 사용하여 페이지 단위로 메모리를 관리합니다. – datenwolf