2012-04-14 5 views
3

저는 개인용 Java OpenGL (JOGL) 프로젝트에서 일하고 있으며 별도의 그리기 기능과 정점이있는 사용자 정의 객체를 사용하고 있습니다.여러 개의 glDrawArrays()를 사용하거나 하나의 큰 glDrawArrays-call에 모든 꼭짓점을 모아야합니까?

public class Cube extends PhysicalObject { 

public void draw(GL gl) { 

     gl.glColor3f(1.0f, 1.0f, 0.0f); 

     gl.glEnableClientState(GL.GL_VERTEX_ARRAY); // Enable Vertex Arrays 

      gl.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY); 

      gl.glVertexPointer(3, GL.GL_FLOAT, 0, vertices); 

      gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, texCoords); 

      gl.glDrawArrays(GL.GL_QUADS, 0, 4*6); 


      gl.glDisableClientState(GL.GL_VERTEX_ARRAY); 

      gl.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY); 

} 

그런 다음이 큐브 전체를 반복하여 그리기 기능을 호출합니다. 내 질문은 다음과 같습니다. 모든 정점을 하나의 큰 glDrawArrays 호출로 수집해야합니까? 즉, 모든 정점을 하나의 큰 배열로 모아 그립니다. 그것은 성능 및 fps에 많은 영향을 줍니까?

답변

6

일반적인 규칙에서 OpenGL의 수는 특히 네이티브 코드와 인터페이스에 오버 헤드가의 자바 나 C# 같은 언어에서 호출 최소화하는 것이다에게 있습니다. 그러나 두 개의 개별 모델 행렬을 동일한 그리기의 다른 부분에 적용 할 수 없기 때문에 다른 객체를 그룹화하지 않아야합니다 (다른 모형 행렬 적용, 다른 색상 적용 등) 요구. 따라서 기본적으로 모든 큐브가 변경되지 않으면 모든 큐브를 그룹화하는 것이 좋습니다. 그렇지 않으면 별도로 유지하는 것이 좋습니다.

성능에 도움이되는 또 다른 사항은 상태 변경 횟수를 최소화하는 것입니다. 10,000 큐브를 그리는 경우 큐브 draw 메서드에서 glEnableClientStateglDisableClientState 호출을 이동하고 모든 큐브가 그려지기 전/후에 만 ​​호출합니다. 그들은 모두 같은 질감을 사용하는 경우, 처음에 한 번 텍스처를 바인딩하고 마지막에 한 번 바인딩 해제.

오, 실제로 성능에 대해 걱정이된다면 대부분의 컴퓨터 (2 년 된 넷북 포함)는 OpenGL 1.5를 지원하므로 데이터를 VBOs으로 이동하면 성능이 크게 향상됩니다. Minecraft과 같은 작업을 수행하는 경우 최적의 최적화 방법은 모든 큐브를 거쳐 표면을 드로잉하는 것입니다.

1

우려 성능에 관한 경우, 나는 ... 당신이 제안 구현 중 하나에 매우 큰 변화를 볼 수 있습니다 성능 향상을 할 수있는 내 과거의 경험에서

, 한 가지를 생각하지 않는다 List (더 나은 메모리 성능)를 사용하는 것입니다.

이 좋은 Opengl bottleneck PDF

+0

"목록"이 무슨 뜻인지 정확히 모르겠습니다. ArrayList 또는 VertexBufferObject, 또는 여기에 요점이 누락 되었습니까? – JulenissensHjelper

+1

명확하지 않은 경우 내 사과 ... "CallList"또는 "DisplayList"라고합니다. http://www.swiftless.com/tutorials/opengl/displaylists.html – Erwald

+0

그래, 고마워. 내가 조사 할거야. – JulenissensHjelper