Thursday, April 2, 2015

OpenGL glFlush()와 glFinish()

glFlush()와 glFinish()

OpenGL은 네트워크를 통해 다른 머신에 랜더링을 할 수 있도록 지원한다. 클라이언트에서 애플리케이션의 메인코드가 실행이 되고 랜더링 서버에서 랜더링을 담당한다고 하자. OpenGL은 드로잉커맨드의 전송 효율을 높이기 위해 여러 드로잉커맨드를 한 패킷에 모아서 보낸다.
한 패킷을 다 채우지 못해서 클라이언트가 드로잉커맨드들을 전송하지 못하고 있고, 서버에서는 버퍼에 있는 모든 드로잉커맨드를 소비해서 처리할 게 없는 경우가 생길 수 있다. 이 때, glFlush()를 사용하면 패킷을 꽉 채워지지 않은 상태로 서버로 전달할 수 있다.

glFlush()함수는 패킷을 보낸 뒤에 바로 리턴을 하므로 다른 처리를 이어서 할 수 있다. 예를 들어, glFlush()를 함수 내에서 사용하는 DrawFrame()함수를 for문을 사용하여 백번 호출했고, 바로 이어서 키보드/마우스 이벤트를 처리하여 그 결과를 다음 프레임(101번째 frame)에서 확인하고자 한다면, 서버에서 101번째 frame을 처리할 때까지 기다려야만 하는데, 클라이언트는 서버에서 모든 드로잉커맨드를 처리했는지 확인할 방법이 없다. 이를 위해서는 glFlush() 대신 glFinish()를 사용할 수 있다. glFinish()는 서버에서 모든 드로잉커맨드가 처리되었다는 응답이 왔을 때 비로소 리턴한다.

싱글 버퍼 렌더링을 사용할 때에는 드로잉 결과가 화면에 그려지길 원할 때마다 glFlush나 glFinish를 반드시 호출해야 한다.


No comments:

Post a Comment