2012-08-10 2 views
1

Android 및 iOS에서 GLES 2.0이 동기식 또는 비동기식으로 호출합니까? 언제 CPU를 차단하고 GPU가 전송 된 명령을 완료 할 때까지 기다릴 것입니까? glReadPixels 및 glGetTexImage 확실히 스레드를 차단하고 모든 gl 명령을 완료 할 때까지 기다릴 것으로 생각합니다.GLES iOS, Android RenderBuffer 동기식 또는 비동기식?

일부 테스트 후에 GL 호출이 동기식이고 GPU가 CPU를 차단하기 때문에 멀티 스레드 응용 프로그램이 단일 코어 장치에서도 성능을 얻을 수 있다고 생각합니다.

iOS 및 Android에서 gl * 호출이 동기인지 여부에 대한 참조가 있습니까? 나는 그것이 일반적으로 동기식이 아니라는 것을 알고있다.

2 개의 스레드가있는 것이 합리적입니까? GL 호출을 수행하는 스레드와 GL 스레드가 메인 스레드를 처리 할 때 CPU에 작업을 수행하는 다른 스레드가 있습니까?

답변

2

대부분의 OpenGL 명령은 프로그램 실행을 차단하지 않습니다. 그리기 호출을 상태 또는 문제로 설정하는 모든 것은 GPU 푸시 버퍼에 명령을 넣고 즉시 반환합니다. 명령이 GPU에 도달하거나 모델이 다음 명령이 실행되기 전에 그리기를 마칠 때까지 기다릴 필요가 없습니다.

예외는 GPL에서 상태를 요청하는 것입니다 (예 : glGet.../glRead... 작업). 이를 위해서는 GPU가 명령 큐를 플러시하여 정확한 값을 반환 할 수 있어야합니다. 이것들은 긴 포장 마차를 야기 할 수 있으므로, 필요에 따라 절제하는 것이 좋습니다.

2 개의 스레드가있는 것이 합리적인가요? GL 호출을 수행하는 스레드와 GL 스레드를 처리 할 때 CPU에 작업을 제공하는 다른 스레드가 있습니까?

다릅니다. 일반적으로 GPU를 기다리고있는 경우에는 계산을 계속하기 위해 즉각적인 가치가 필요하기 때문입니다. 백그라운드에 의존하지 않는 작업이 있다면, 다른 스레드로 오프로드하는 것이 좋다.

+0

RenderBuffer를 사용한 작업이 예외이며 차단 중입니까? 나는 오프 스크린 렌더링을 한 다음 그 이미지를 텍스처로 사용하여 다른 버퍼에서 렌더링합니다. 이러한 작업은 메인 스레드를 차단할 수 있습니까? 특히 iOS 및 Android와 같은 모바일 앱의 경우 고맙습니다 – Max

관련 문제