이것은 아마 내가 상당히 큰 메쉬를 렌더링 할 필요가 내 응용 프로그램에서 ... 튜닝의 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_FLOAT
과GL_UNSIGNED_BYTE
과 같은 위치와 법선을 가진 인터리브 된 저장 공간을 사용한다. 패딩 바이트 하나는 4 바이트 정렬 (28 바이트/버텍스 합계)을 얻는다. - 내 모든 상자에 대한 법선에 대해 동일한 버퍼를 사용하는 것이 도움이 될 수 있습니다 (모든 상자는 축 정렬되어 있으므로 가장 큰 캐시 항목의 크기를 일반 버퍼에 할당하여 모든 항목에 사용할 수 있습니다).
- 파이프 라인의 어느 부분에 병목 현상이 있는지 어떻게 알 수 있습니까? 나는 화려한 비디오 카드 (인텔 GM965와 오픈 소스 리눅스 드라이버)가 없으므로 한계에 도달했을 가능성이 있습니다. 일반적인 하드웨어 (2 ~ 3 년 된 통합 그래픽, 최신 통합 그래픽, 최신 독립 그래픽)에서 예상되는 처리량은 어느 정도입니까?
- 이, 함정을 해결 할 방법에 대한 다른 팁 등
내가 LOD를 제안 답변에 관심이 아니에요 (I 이미이 시험), 공급 업체 특정 조언 나중에 아무것도에서의 OpenGL 기능을 사용하여 1.5보다.
프리미티브는 축 정렬 상자에서만 구성됩니까? – Stringer
@Stringer Bell : 예 (반드시 세계 축과 정렬되지는 않음). – Staffan
확실하지 않지만 그래픽 카드 한도에 도달했습니다. 나는 조금 봤 거든 인텔 GM965에는 게임을 위해, espacially 확실히 낮은 성과가다는 것을 보인다. (너의 게임은 아니지만 렌더링하는 데 "힘든"것처럼 보인다.) Nvidia에는 카드가 초당 렌더링 할 수있는 트라이앵글의 수를 나열한 목록이 있습니다. 아마도이 목록으로 카드를 분류하여 "이론적 인"제한을 알아낼 수 있습니다. – InsertNickHere