2015-01-11 3 views
0

OpenGL 2 (특히 ES)에서 투명하지 않은 객체의 렌더링 순서를 최적화하는 가장 좋은 방법은 심도 정렬에 대한 컨텍스트 변경 (다른 버퍼, 셰이더 프로그램 바인딩 등)의 우선 순위를 지정하는 것입니다.전에 glBindBuffer, glUseProgram 등을 비효율적이라고 같은 값으로 호출하고 있습니까?

이미 바인딩 된 버퍼를 사용하여 glBindBuffer를 호출하거나 이미 현재 프로그램 인 쉐이더 프로그램 등을 사용하여 glUseProgram을 호출하면 비효율적 인 파이프 라인 플러시가 발생하거나 라이브러리를 인식 할만큼 충분히 똑똑 해집니다 NOOPs로서의 그들? 이미 바인딩 된 내용을 추적하지 않고 필요한 모든 것을 바인딩 할 수 있다면 코드를 더 간단하게 만들 수 있습니다.

답변

2

아마도. 이것은 일반적으로 일반적으로 대답 할 수 없습니다. 완전히 구현에 의존합니다.

운전자가 중복 된 상태 변경 사항을 확인해야하는지 여부는 다소 철학적 인 토론이며, 이에 대한 의견 일치는 찾을 수 없습니다. 따라서 다른 공급 업체가이를 다르게 처리 할 것을 기대해야하며 동일한 드라이버의 모든 주에서 일관되게 처리한다고 가정하지는 않습니다.

특정 플랫폼을 타겟팅하는 경우 측정해야합니다. 다행스럽게도 이것은 벤치 마크하기 매우 쉽습니다. 광범위한 플랫폼/공급 업체를 대상으로하고 싶다면 중복 상태 변경을 최소화 할 수 있습니다. 적어도 상대적으로 싸게 할 수있는 옵션이 있다면. 이것에 많은 오버 헤드를 추가하면 좋지 않은 것보다 더 많은 해를 끼칠 수 있습니다.

여기에 의견이 다른 주된 이유는 중복 된 상태 변경을 확인하는 것이 완전히 자유롭지 않다는 것입니다. 드라이버가이 작업을 수행하면 모든 사람에게 오버 헤드가 적용됩니다. 따라서 불필요한 상태 변경을하지 않는 잘 작성된 응용 프로그램은 잘못 작성된 응용 프로그램에 도움이되는 최적화 비용을 지불합니다. 당신이 주장 할 수있는 것은 매우 불공평합니다.

사실 이러한 점검은 종종 상태 변경 자체가 상당히 비싼 경우에 수행됩니다. 물론 상태 변경이 매우 저렴하면 수표를 추가 할 가치가 없습니다. 수표는 종종 중요한 앱/게임 벤치 마크의 성능 최적화에 의해 유도됩니다. 불행히도 많은 애플 리케이션/게임은 OpenGL을 매우 비효율적으로 사용하며 드라이버는 중요한 벤치 마크에 대해 최상의 결과를 이끌어 내야합니다. 이러한 경우 중복 된 상태 변경을 필터링하는 것이 일반적인 최적화입니다.

0

각 glBindBuffer 또는 glUseProgram 등 호출은 대기열에 명령 객체를 만듭니다. 이 큐는 얼마 후에 gpu에서 수행됩니다. 여기에 병목 현상이 2 개 있습니다. 1) 대기열에 명령 객체를 생성하려면 코드를 커널 모드로 전달하여 드라이버에 전달해야합니다. 일반적으로이 작업에는 약간의 지연이 있습니다. 2) GPU가 하나씩 명령을 수행하고 이미 버퍼가 바인딩되었는지 확인하기 위해 GPU가 명령을 읽고 해독해야합니다.

두 번째 드라이버가 현재 상태를 추적해야하는 것을 방지하려면 OpenGL 드라이버가이 작업을 수행하지 않아야한다고 생각합니다.