OpenGL

[OpenGL] Delayed execution 지연실행와 glFlush, glFinish

usingsystem 2024. 4. 2. 23:15
728x90

OpenGl 함수는 효율성을 높이기 위해 명령어 큐에 기록하고 바로 retrun한다.

 

OpenGL에서의 delayed execution은 일반적으로 OpenGL 명령이 실제로 그래픽 처리 장치인 GPU에 의해 처리될 때까지 실행이 지연되는 것을 의미합니다.

OpenGL에서 그래픽 명령을 호출하면 이러한 명령들은 일반적으로 버퍼에 쌓이게 됩니다. 그러나 이들 명령이 실제로 그래픽 처리 장치인 GPU에 의해 실행되는 시점은 보장되지 않습니다. OpenGL은 이들 명령을 GPU에 보내고, GPU가 이들을 처리할 때까지 기다리지 않습니다. 따라서 OpenGL 명령이 실제로 실행되는 지점은 명령을 호출한 다음 프레임 버퍼를 사용하거나 명령의 결과를 읽어들일 때까지 알 수 없습니다.

이러한 delayed execution은 OpenGL의 비동기적 동작의 일부로, 렌더링 명령을 OpenGL에 보낸 후에도 CPU는 다른 작업을 수행할 수 있습니다. 그리고 OpenGL이 명령을 GPU에 전달하고 실행하는 동안 CPU는 다른 작업을 처리합니다. 이는 효율적인 다중 작업 처리를 가능하게 합니다.

따라서 OpenGL에서의 delayed execution은 OpenGL 명령이 GPU에서 실행되는 시점을 명확하게 정의하지 않고, 명령을 보낸 후에도 CPU는 다른 작업을 수행할 수 있다는 점을 나타냅니다. 이는 OpenGL 프로그래밍에서 이해해야 할 중요한 측면 중 하나입니다.

구조

Opengl응용프로그램 -> OpenGl함수는 queue에 기록하고 즉시 return -> 명령어 큐 GL command queue -> OpenGL Rendering Pipeline(항상 할 일이 있으므로 대기 시간이 없음)

 

이런 구조는 계속 화면에 그림을 그리게하여 최고의 품질의 그림이 나오도록 그리고 가장 빠르게 처리해주는 방법으로 도입되었다. 하지만 OpenGL프로그램 입장에서는 명령어 큐에 넣었다 랜더링 파이프라인을 거치는 동안 약간의 지연이 된다.

glFlush와 glFinish

glFlush와 glFinish는 시간제한이 일어날 수 있다. 되도록 적은 횟수로 사용하는 것 이좋다. 중간중간에 굳이 플러쉬 하거나 피니쉬 할 필요는 없다. 전체 화면을 다 그리고 나면 마지막에 한번 사용하여 업데이트 되길 희망한다는 뜻으로 사용하는게 좋다.

 

void glFlush(void)

  • OpenGL 명령 큐를 flush한다. 대부분 바로실행되지만 일부는 시간이 더 필요할 수 있다.

void glFinish(void)

  • OpenGl 명령어 큐를 flush하고 모두 완료되는 것을 확인 후에 return한다. 내가 내린 명령이 꼭화면에 나올 때 까지 기다리고 싶다면 사용한다. glFinish는 모두 완료되는 것을 확인하기 때문에 시간이 오래걸릴 수도 있다.
728x90