2010-07-13 4 views
14

이것은 아마 내가 상당히 큰 메쉬를 렌더링 할 필요가 내 응용 프로그램에서 ... 튜닝의 OpenGL 성능이

을 통해 물어 이상하지만 난 그래서 여기에 다시 간다 유용한 아무것도 찾을 수있다 (A 2 백만개 이상의 삼각형 또는 그 이상) 나는 괜찮은 프레임 속도를 얻는 데 문제가 있습니다. CPU가 꽤 많이 유휴 상태이므로 GPU에 확실히 묶여 있습니다. 해상도를 변경해도 성능에 영향을 미치지 않으므로 프래그먼트 또는 래스터 바운드가 아닙니다.

메쉬는 동적이지만 (지역적으로 정적 임) 비디오 카드에 모든 것을 저장할 수없고 한 번의 호출로 렌더링 할 수 없습니다. 애플리케이션 별 이유로 데이터는 잎에 복소수가있는 팔각형으로 저장됩니다. 기본적으로 절두체를 기본적으로 무료로 얻을 수 있습니다. 정점 데이터는 좌표, 법선 및 색상으로 구성되며 텍스처 또는 셰이더는 사용되지 않습니다.

내 첫 번째 접근 방식은 너무 느린 것으로 밝혀진 하나의 큰 STREAM_DRAW VBO를 사용하여 메모리에서 모든 것을 렌더링하는 것이 었습니다. 필자의 초기 생각은 아마도 프레임 당 150 MiB를 밀어내는 버스를 과도하게 사용하고 있었기 때문에 그래픽 카드의 정적 VBO에서 객체를 렌더링하는 데 사용 된 기하학을 저장하는 캐싱 스키마를 구현했습니다. 각 VBO는 두 개의 100Kb에서 MiB 상당의 데이터 (VBO 당 더 많은 데이터를 저장하면 더 많은 캐시 쓰 래싱이 발생합니다. 따라서 여기에 절충점이 있습니다). 아래 그림은 데이터가 어떻게 보이는지를 보여주는 예입니다. 빨간색으로 표시된 모든 것은 캐시 된 VBO에서 가져옵니다. 캐시를 사용하는 경우

Example of the rendered data http://gimaker.users.sourceforge.net/0010.png

쇼 아래의 번호로, 나는 성능의 극적인 증가를 볼 수 없습니다. 약 1 백만 삼각형의 완전 정적 메쉬를 들어 나는 다음과 같은 프레임 속도 얻을 : 캐싱없이

  • : 1.95 Hz에서
  • 캐싱 사용하여 버텍스 배열 :
  • 2.0 Hz에서 (> 메쉬의 75 %는 캐시입니다) STATIC_DRAW VBOs를 사용
  • 캐싱 :

그래서 제 질문은 어떻게이 속도를 않습니다 2.4 Hz로? 예 :

  • 성능을 높이기 위해 권장되는 정점 형식은 무엇입니까? 나는 색상을 위해서 GL_FLOATGL_UNSIGNED_BYTE과 같은 위치와 법선을 가진 인터리브 된 저장 공간을 사용한다. 패딩 바이트 하나는 4 바이트 정렬 (28 바이트/버텍스 합계)을 얻는다.
  • 내 모든 상자에 대한 법선에 대해 동일한 버퍼를 사용하는 것이 도움이 될 수 있습니다 (모든 상자는 축 정렬되어 있으므로 가장 큰 캐시 항목의 크기를 일반 버퍼에 할당하여 모든 항목에 사용할 수 있습니다).
  • 파이프 라인의 어느 부분에 병목 현상이 있는지 어떻게 알 수 있습니까? 나는 화려한 비디오 카드 (인텔 GM965와 오픈 소스 리눅스 드라이버)가 없으므로 한계에 도달했을 가능성이 있습니다. 일반적인 하드웨어 (2 ~ 3 년 된 통합 그래픽, 최신 통합 그래픽, 최신 독립 그래픽)에서 예상되는 처리량은 어느 정도입니까?
  • 이, 함정을 해결 할 방법에 대한 다른 팁 등

내가 LOD를 제안 답변에 관심이 아니에요 (I 이미이 시험), 공급 업체 특정 조언 나중에 아무것도에서의 OpenGL 기능을 사용하여 1.5보다.

+0

프리미티브는 축 정렬 상자에서만 구성됩니까? – Stringer

+0

@Stringer Bell : 예 (반드시 세계 축과 정렬되지는 않음). – Staffan

+1

확실하지 않지만 그래픽 카드 한도에 도달했습니다. 나는 조금 봤 거든 인텔 GM965에는 게임을 위해, espacially 확실히 낮은 성과가다는 것을 보인다. (너의 게임은 아니지만 렌더링하는 데 "힘든"것처럼 보인다.) Nvidia에는 ​​카드가 초당 렌더링 할 수있는 트라이앵글의 수를 나열한 목록이 있습니다. 아마도이 목록으로 카드를 분류하여 "이론적 인"제한을 알아낼 수 있습니다. – InsertNickHere

답변

5

....

나는 당신의 문제를 발견했습니다

: 오픈 소스 리눅스 드라이버 인텔 GM965을

내 현재 작업의 볼륨을 공격하지 않지만 데이터를 사용하여 VBO에서 수백만 개의 정점을 렌더링했으며 Intel 그래픽 하드웨어/드라이버는 쓸모가 없음을 입증했습니다. NVidia 카드를 얻으십시오 (그리고 바이너리 드라이버를 사용해야하는 대신 작동합니다). 그러면 모든 설정이 완료됩니다. 최고급 쿼드로 (업무가 지불되는 경우) 또는 최고급 GTX 400 시리즈 (현재 돈을 지불하고 있거나 직장에서 돈을 아끼려고하는 경우)은 최신 제품 일 필요가 없습니다. 최신 운전자. 또한 기계를 업그레이드하는 것이 옵션이 아닌지 테스트하려면이 하드웨어가있는 기계를 찾으십시오.

+0

당신이 옳은 것처럼 보입니다. 필자는 Quadro가 아닌 더 나은 그래픽을 갖춘 시스템에서 테스트를 수행했지만 캐싱이있는 15Hz와 그렇지 않은 경우의 절반을 얻었습니다. 개발자가 아니기 때문에 (현재) 개발자가 아니기 때문에 문제는 불편합니다. – Staffan

+0

@Staffan : 귀하가 GMA 965를 최대한 활용했다는 의미는 아닙니다. 어쩌면 당신은 공연에 나쁜 영향을 미치고있는 것일 수도 있습니다. 솔직히 Intel Media Accelerator Profiler에 시도해 볼 것을 고려할 것입니다 (물론 응용 프로그램을 휴대 할 수있는 경우). GMA가 타일 기반 렌더러임을 잊지 마십시오. – Stringer

+0

@ Stringer Bell : 비디오 카드/드라이버가 한계를 설정하는 것 같습니다. 내 캐싱 메커니즘을 조정 한 후 GeForce 3 Ti200에서 약 2 천 8 백만 삼각형/초를 얻었지만 삼각형을 몇 개 넣을 수 있는지에 대한 공식 사양은 없지만 한계에 상당히 근접한 것처럼 보입니다. – Staffan

0

먼저 성능 프로파일 러 (예 : gDEBugger)를 사용하므로 정점, 프래그먼트 또는 버스 제한 여부 등을 파악할 수 있습니다.특정 경우 (인텔 + 오픈 소스 드라이버)에서 수행 할 최적화 작업을 추측하기는 어렵습니다.

VA 모드를 사용해 보셨습니까? glDrawElements을 사용하고 있습니까? glDrawArrays? 데이터 버텍스 캐시가 친숙한가 (사전 및 사후 변환)?

당신은 아마이 응답을 좋아하지 않을거야
+0

Bell : Linux 용 공개 소스 (또는 무료)가있는 경우 OpenGL 프로파일 러를 사용합니다 ([내 다른 질문] 참조) (http://stackoverflow.com/questions/3235864/open-source-opengl-profiler- for-Linux)). 오픈 소스 드라이버는 인텔이 개발 한 공식 드라이버이지만 이미 알고있는 것으로 생각됩니다. 내가 정점 사이에 데이터를 공유 할 수 없기 때문에 glDrawArrays를 사용하고 있습니다 (모든 정점이 다른 법선 또는 위치를 가짐). VA 모드 란 무엇입니까? 데이터는 캐시 친숙한 AFAICT, 즉 인터리브 된 저장소입니다 (변환이 어떻게 영향을 미치는지는 확실하지 않음). – Staffan

+0

나는 닫힌 소스 임에도 불구하고 gDEBugger를 시도했지만, 나에게 도움이되지 않는다. (간접적 인 컨텍스트를 제공하고 SIGSEGV를 발생시킨다.) – Staffan

+0

VA 모드는 일반 1.1 버텍스 배열입니다. 후 변환 캐시는 색인이있는 경우에만 사용됩니다 (http://www.opengl.org/wiki/Post_Transform_Cache 참조). GL_QUAD 또는 GL_TRIANGLES를 사용하여 상자를 렌더링합니까? – Stringer

0

"메쉬"에 대해 모르겠지만 모든 큐브처럼 보입니다. 가능하면 단일 표시 큐브를 표시 목록에 렌더링하고 해당 표시 목록의 배율 조정 된 버전을 렌더링합니다. 버스가 버텍스 데이터 나 비디오 메모리가 소모되어 펌핑되지 않기 때문에 종종 속도가 10 배 향상됩니다.

물론 데이터를 변경하는 능력에 따라 다릅니다. 실제로 그림과 같지 않은 경우에는 그렇지 않을 수도 있습니다.

+0

그들은 모두 직육면체입니다. OP에서 설명한 것처럼 버스 오버 테스터를 피하기 위해 VBO 캐시를 사용합니다. 위 이미지를 생성하는 데 glVertex3() 호출이 필요하지 않았습니다. – Staffan

+0

VBO! = Display List ... 차이점은 비디오 메모리에 있더라도 VBO는 여전히 LARGE ARRAY를 사용한다는 것입니다. 대부분의 경우 버텍스 배열에서 10000 큐브에 해당하는 10000 x 1 DL을 호출 할 때 가장 좋아합니다. – rioki

관련 문제