2010-04-18 2 views
5

OpenGL 응용 프로그램의 프론트 버퍼에서 전체 프레임을 다시 읽어야하는 응용 프로그램을 개발 중입니다. 응용 프로그램의 OpenGL 라이브러리를 납치하고 swapbuffers에 코드를 삽입 할 수 있습니다. 지금은 성공적으로 PBO가없는 단순하지만 심한 느린 glReadPixels 명령을 사용하고 있습니다.여러 PBO를 사용하여 opengl 프론트 버퍼에서 비동기 리드 백

이제 여러 가지 PBO를 사용하여 작업 속도를 높였습니다. 실제로 프로그램을 작성하는 데 충분한 리소스를 찾은 것 같지만 (어려운 것은 아니지만), 몇 가지 운영상의 문제가 남아 있습니다. 오른쪽

  1. (예 3) 내 swapBuffers에서 PBO의
  2. 사용 glReadPixels의 (빠르고 비 차단 될해야 PBO에 프런트 버퍼에서 데이터를 읽을 오버라이드 (override) 시리즈를 만들 : 나는 같은 것을 할 것 ?)
  3. glReadPixels 이후에 PBO 당 한 번 glMapBufferARB를 호출하는 별도의 스레드를 만듭니다.이 스레드는 픽셀이 클라이언트 메모리에있을 때까지 차단되므로이 스레드를 차단합니다.
  4. 프로세스 3.

지금 나의 주요 관심사는 2 단계와 3에 물론이다 단계의 데이터는 내가 새로운 발행 할 경우이 문제가 될 것입니다, PBO의 인 비 차단에 사용 glReadPixels에 대해 읽어 그 후 매우 빠른 OpenGL 명령? 그 OpenGL 명령이 차단됩니까? 아니면 그들은 계속 (내 추측), 그리고 만약 그렇다면, swapbuffers만이 문제가 될 수 있다고 생각합니다.이 버퍼가 멈추거나 프런트 버퍼의 glReadPixels가 여러 번 (15-> 30ms마다) 또는 최악의 경우 시나리오, glReadPixels가 여전히 PBO에 데이터를 읽는 동안 swapbuffers가 실행됩니까? 내 현재의 추측은이 논리는 다음과 같이 할 것입니다 : copy FRONT_BUFFER -> VRAM의 일반 장소, VRAM-> RAM 복사. 그러나 나는 그 중 2 개가 실제 병목 현상인지 아닌지, 정상적인 OpenGL 명령 스트림에 어떤 영향이 있는지 전혀 알지 못합니다.

다음 단계 3. 일반 OpenGL 논리와 분리 된 스레드에서 비동기 적으로 수행하는 것이 현명한 방법입니까? 순간에 나는 생각하지 않는다. 버퍼 연산을 정상적으로 복원해야하고 원래 코드에 동기화 객체를 설치하여 일시적으로 버퍼 객체를 차단할 수 없다. 그래서 내 최선의 방법은 특정 swapbuffer 지연을 정의하는 것입니다 그들을 밖으로 읽기 전에, 그래서 예 : 동일한 스레드에서 PBO i % 3에서 glReadPixels을 호출하고 PBO (i + 2) % 3에서 glMapBufferARB를 호출하여 2 프레임의 지연이 발생합니다. 또한, 클라이언트 메모리에서 데이터를 사용하도록 glMapBufferARB를 호출하면 병목 현상이 발생하거나 병목 현상이 glReadPixels (비동기식)가됩니까?

마지막으로, OpenGL에서 GPU의 프레임 리드 백 속도를 향상시키는 아이디어가 있다면 현재 시스템에서 병목 현상이 발생하기 때문에 알려주십시오.

내 질문에 충분히 희망이 있기를 바란다. 인터넷에서 어딘가에 있을지도 모른다.하지만 비디오 메모리에 버퍼를 유지하고 거기에서 처리하는 PBO를 사용한 결과가 대부분 나온다. 프론트 버퍼를 RAM으로 다시 읽어 들일 필요가 있고 그 경우 성능에 대한 명확한 설명을 찾지 못합니다 (필자는 "더 빠릅니다"에 의지 할 수 없기 때문에 더 빨리 설명해야합니다).

고맙습니다.

답변

3

프론트 버퍼에서 읽으시겠습니까? 이 버퍼를 소유하지 않으므로 OS에 따라 예를 들어 그 위에있는 다른 창에 의해 파손될 수 있습니다.사용 사례를 들어

, 사람들은 일반적으로 할

  • PBO는
  • 무승부 N + 1
  • PBO는 N + 1
  • 동기화를 읽기 시작 백 버퍼에서 N 읽기 시작
  • 무승부 N
  • PBO 읽기 N
  • 과정 N
  • ...

단일 스레드에서.

+0

프론트 버퍼 (또는 콜백 직전의 백 버퍼)에서 읽으려는 것을 알고 있습니다. 실제로는 문제가 아닙니다. 당신의 대답은 제가 실제로 다소 의심 스레딩에 관한 제 질문에 도움이됩니다. 하지만 실제로 GPU의 화면 뒤에서 무슨 일이 일어나는지 알고 싶습니다. 차단할 때, 차단하지 않는 경우, 두 개 이상의 PBO를 사용하는 것이 합리적일까요? 어쨌든 답변 주셔서 감사합니다 :)! – KillianDS

+0

백 버퍼를 사용하는 것이 더 좋습니다. 뒤에서 일어나는 일은 드라이버에 따라 다릅니다. 일반적으로 비동기 읽기는 GPU로 게시되고 GPU가 처리 할 때 처리됩니다. 완료되면, GPU는 운전자에게 작업이 완료되었음을 알리는 토큰을 되돌려 보내며, mapBuffers를 차단 해제합니다. 좀 더 구체적인 내용이 있으면 nVidia/AMD 엔지니어와상의해야합니다. '비행 중'프레임 수에 따라 두 개 이상의 버퍼를 사용하는 것이 좋습니다. 단순히 구성 가능하게 구현하고 벤치마킹하십시오. – eile