2012-01-25 3 views
2

나는 CPU와 GPU 사이의 데이터 전송을 위해 PBO를 사용하는 멀티 스레드 OpenGL 응용 프로그램을 가지고 있습니다.별도의 스레드에 PBO 할당?

풀이 비어있을 때 PBO 할당을 풀링했습니다. OpenGL 스레드가 버퍼를 할당 할 수있는 지점에 도달 할 때까지 비어 있지 않은 OpenGL 스레드가 잠시 블록되어야합니다 (즉, 현재 프레임 렌더링이 끝났습니다.). 이 대기는 필자가 피하고 싶지 않은 특정 상황에서 일부 지연 스파이크를 유발합니다.

"메인"OpenGL 스레드가 사용하는 다른 스레드에 PBO를 할당 할 수 있습니까?

답변

4

예, 한 스레드에서 다른 스레드에서 사용할 수있는 개체를 만들 수 있습니다. 이 작업을 수행하려면 새로운 GL 컨텍스트가 필요합니다.

그런데 두 가지 문제가 있습니다.

먼저, "PBO 할당"이 의미하는 바에 달려 있습니다. 프레임 중간에 버퍼 객체를 할당해서는 안됩니다. 필요한 모든 버퍼를 할당해야합니다. 시간을 사용할 때, 당신은 단순히 가지고있는 것을 사용할 수 있습니다.

"allocate"는 전에 사용 된 것과 다른 크기 또는 드라이버 힌트를 사용하여 이전에 할당 된 버퍼에 glBufferData을 호출하는 것을 의미합니다. 또는 어떤 식 으로든 glGenBuffersglDeleteBuffers을 사용하십시오. 이들 중 어느 것도 프레임 내에서 일어나지 않아야합니다.

둘째, 버퍼를 무효로하면 "지연 스파이크"가 발생하지 않아야합니다. "무효화"란 동일한 크기 및 사용 힌트를 사용하거나 glMapBufferRangeGL_INVALIDATE_BUFFER 비트와 함께 사용하여 glBufferData 버퍼를 재 할당하는 것입니다. 자세한 내용은 this page on how to stream buffer object data을 참조하십시오. 문제가 발생하면 NVIDIA 하드웨어에서 잘못된 버퍼 객체 힌트 (예 : STREAM 사용)를 사용하고있는 것입니다.

+0

버퍼 객체 스트리밍 정보에 대한 링크를 잊어 버렸습니다. – genpfault

+0

@genpfault : 수정 됨. 감사. –

관련 문제