2012-03-13 6 views
1

이것도 가능합니까? DirectX atm을 배우면서 OpenGL에 대해 배웠던 것을 적용하려고합니다.OpenGL의 멀티 스레드 렌더링

지연된 컨텍스트를 사용하여 DirectX에서 멀티 스레드 렌더링을 할 수 있지만 OpenGL에서이 지원을했다고 생각하지 않았지만 OpenGL에서 멀티 스레드 예제를 찾았지만 멀티 스레드 렌더링은 찾지 못했습니다. 또는 어쩌면 나는 그 차이를 잘못 이해 했는가?

가능한 경우 누구나 나를 위해 몇 가지 기본 코드를 제공 할 수 있습니까?

+1

그냥 비동기 업로드를 사용하십시오. http://www.opengl.org/wiki/OpenGL_and_multithreading – harold

+3

MT 렌더링에서 얻을 수있는 정보가 확실하지 않습니다. AFAIK, D3D 및 OpenGL은 결국 드라이버 수준에서 단일 스레드로 명령을 직렬화해야합니다. MT 렌더링이 문제를 심각하게 복잡하게 만든다고 생각합니다. – Robinson

+3

"지연된 컨텍스트를 사용하여 DirectX에서 멀티 스레드 렌더링을 할 수 있다는 것을 알고 있습니다."멀티 스레드 렌더링이 아닙니다. 이는 단순히 일부 렌더링 명령을 저장하고 다시 재생하는 것입니다. –

답변

1

OpenGL에는 D3D11의 지연된 컨텍스트가 없습니다. 그 중 가장 가까운 것은 디스플레이리스트 일 것이지만, 이것들은 전혀 다른 문제를 해결하며, 반복해서 다시 빌드하기위한 것은 아닙니다.

2

이 정말 작전의 질문에 대한 답변은 아니지만, 그의 요청에 중요하다 :

GPU가 상호 배타적 인 자원처럼 다소이다. 드로잉 작업을 수행하는 스레드가 여러 개인 경우 관리 오버 헤드가 발생합니다. 작업은 셰이더 단위로 분할되어야하거나 일부 시간 분할이 관련되어 있습니다. 어쨌든 드로잉 작업이 동일한 프레임 버퍼로 이동하면 작업이 동기화되어야합니다. 즉, GPU 파이프 라인이 상당히 자주 멈추는 것을 의미합니다.

결과적으로 GPU에서 멀티 스레드 연산을 수행하면 성능이 크게 저하 될 수 있습니다.

또한 작업을 병렬화하기 위해 GPU에서 다중 스레드 작업을 수행 할 필요가 없습니다. 이것은 이미 GPU 개별 쉐이더 유닛으로 분할되는 단일 그리기 작업에 의해 발생합니다.

+0

OpenGL 드라이버가 악명 높게 단일 스레드이므로 명령이 아마도 같은 명령 대기열에있게 될 것이라고 덧붙여 야합니다. 다중 컨텍스트를위한 단일 유용한 경우는 진정한 비동기 입출력을 위해 DMA/복사 엔진을 활용하는 것입니다. – RecursiveExceptionException

+0

@itzJanuary : 지난 수년 동안 OpenGL 드라이버 내에서 다중 스레드 작업이 많이 개선되었지만 여전히 전역에 많은 잠금이 있습니다 . 결국 그것은 큰 상태 머신이고 서로 다른 스레드의 활성 컨텍스트간에 자원을 공유함으로써 많은 잠금을 트리거합니다. Vulkan은 멀티 스레딩에 훨씬 적합하지만 Vulkan에서도 일부 스레드는 단일 스레드로 끝납니다. – datenwolf