문제

내 프로그램은 psyco와 함께 pyopengl (파이썬)을 사용합니다.

렌더의 각 프레임에서 렌더링 해야하는 약 21,000 개의 라인 세그먼트가 있습니다 (사용자가 확대하지 않는 한 라인 세그먼트가 컬링되어 카드로 전송되지 않음). 이것은 현재 완료하는 데 각 프레임 각각 약 1.5 초가 걸리고 있습니다. 그것은 충분하지 않기 때문에 고유 한 선 세그먼트의 수를 줄이는 방법을 찾고 있습니다.

여러 줄 세그먼트가 하나의 큰 라인으로 병합 될 수있는 경우가있을 것이라고 생각하지만 솔직히 이것으로 시작해야 할 곳조차 모릅니다. 각 라인의 시작점과 엔드 포인트가 저장되어 있으므로 도움이 될 수 있습니다. 시작시 필요한만큼 시간이 걸릴 수 있으며 메모리 사용은 그다지 관심이 없습니다.

어떤 아이디어라도 대단히 감사 할 것입니다.

도움이 되었습니까?

해결책

성능을 죽이는 모든 즉각적인 모드 기능 호출의 오버 헤드입니다. 나는 다음을 할 것이다.

사용하지 마십시오 GL_LINE_STRIPS, 단일 목록을 사용하십시오 GL_LINES 대신 그들은 한 번에 렌더링 될 수 있습니다.

사용 glDrawArrays 즉각적인 모드 렌더링 대신 :

float* coordinates = {....}; //x and y coordinate pairs for all line segments
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 2 * sizeof(float), coordinates);
glDrawArrays(GL_LINES, 0, 2 * linecount);
glDisableClientState(GL_VERTEX_ARRAY);

(더 나은 성능을 위해 Vertex 버퍼를 정점 버퍼 객체라고하는 것에 보관할 수 있지만, 처음에는 괜찮을 것입니다).

마지막으로, 한 줄에 따라 컬링을한다면 건너 뛰고 모든 줄을 GPU로 보내는 것이 더 빠릅니다.

다른 팁

20K 세그먼트는 그리 많지 않습니다. 또한 프레임 당 10-100 줄을 병합 할 수있을 때 운이 좋으 므로이 최적화의 속도를 무시할 수 있습니다. 모델을 반복해서 만들기 때문에 렌더링 프로세스가 느리게있을 수 있습니다. 사용 glNewList() 카드의 GL 렌더링 목록에 모든 렌더링 명령을 저장 한 다음 glCallList() 단일 명령으로 렌더링합니다.

두 줄 세그먼트를 하나로 병합 한 다음 모든 세그먼트 쌍을 테스트 한 다음 오류가 특정 임계 값 미만인 경우 병합하는 오류 메트릭을 정의 할 수 있습니다.

한 가지 예는이 알고리즘입니다.

  1. 두 줄 세그먼트 A와 B에서 서로 가장 멀리 떨어진 두 지점에서 새 라인 세그먼트 X를 구성하십시오.
  2. A와 B의 모든 지점에 대해 최소 X까지의 거리를 찾으십시오.
  3. 최소 거리의 최대 값으로 오류를 할당하십시오.
  4. 오류가 임계 값 아래에 있으면 a와 b를 x로 교체하십시오.

이것은 최고의 알고리즘은 아니지만 구현하기 쉽습니다.

편집 1

이를 구현하기 전에 디스플레이 목록 또는 정점 버퍼 객체 렌더링을 수행하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top