OpenGL

[OpenGL] Double buffering와 glfwSwapBuffers

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

화면을 업데이트하다가 생기는 문제 때문에 하드웨어적인 해결처를 찾은 게 double buffering이다.

 

우선 프레임버퍼는 그래픽스 카드상에 있는 특별한 2D Array를 의미한다. 쉐도우 프레임을 이용하여 2D Array인 프레임 버퍼 에다 어떤 내용을 업데이트한다. 그러면 그래픽 카드에 하드로 구현되어 있는 디스플레이 프로세서가 이 2d Array를 계속 무한 반복해서 모니터에 그대로 보여준다. 디스플레이 프로세서는 1초에 60~ 120번 정도에 굉장히 빠른 속도로 화면을 업데이트하고 있는 게 문제가 될 수 있다. Partial Update Problem이라는 문제로 어떤 경우는 처음에 OpenGL 프로그램에서 쉐이드 프로그램이 프레임 버퍼에 그림을 다 그려놓은 상황에서는 문제가 없다. 하지만 OpenGL 프로그램이 작동하면서 화면상에다가 새로운 그림을 그리기 시작할 때 그리는 시간이 오래 걸려 그림을 그리고 있는 중간에 디스플레이 프로세서가 업데이트하여 모니터상 일부는 새로운 그림이 나오고 일부는 옛날 그림이 나오는 비정상적인 출력이 나올 수 있다. 이런 현상은 디스플레이 프로세서 입장에서 모니터 끊김이 없으려면 무조건 1초에 60~120번 정도 화면을 그려야 하기 때문이다. 지금은 OpenGL의 성능이 향상되어 상당히 빠르게 동작하여 이런 문제가 거의 일어나지 않지만 잠재적으로 이런 문제를 포함하고 있다. 이런 비정상적인 그림을 그리는 상황을 해결하기 위해 나온 것이 Double buffering이다.

 

Double buffering은 컴퓨터 그래픽스에서 사용되는 기술로, 화면에 그릴 내용을 두 개의 버퍼(프론트 버퍼, 백버퍼)에 나누어서 처리하는 방식을 말합니다.

일반적으로 그래픽 시스템은 화면에 그릴 내용을 담고 있는 메모리 영역을 가지고 있습니다. 이 내용이 변경되면, 그 내용을 실제 화면에 반영하여 표시합니다. 이때, 화면에 그릴 내용을 직접적으로 변경하는 것이 아니라, 먼저 다른 메모리 영역인 백 버퍼(back buffer)에 그림을 그리고, 화면을 갱신할 때마다 백 버퍼의 내용을 프런트 버퍼(front buffer)로 스왑하는 방식을 사용합니다.

  • 백 버퍼: 실제로 화면에 출력되지는 않지만, 변경된 내용이 반영되는 버퍼로 OpenGL은 back buffer에 그린다.
  • 프론트 버퍼: 실제로 디스플레이 화면에 출력되는 버퍼입니다.

OpenGL 출력이 완료되면 glFlush(); 또는 glFinish()를 사용하여 그림이 다 그렸다는 걸 알려주고 그림이 완성된 상황이 발생합합니다.

 

glfwSwapBuffers(window)를 사용하여 Swap Buffers를 한다면 back buffer는 new frong buffer로 front buffer은 new back buffer로 이동하게 되어 즉시 OpenGL이 완료한 그림을 새롭게 화면에 그릴 수 있다.

glfwSwapBuffers(window);//현재 Frame에 그려진 Buffer와 현재 Frame에 그려진 buffer를 swap(Double buffer)

 

Double buffering의 장점

  1. 화면에 플리커링이 발생하지 않습니다: 백 버퍼에 그림을 그리고, 완전히 그림이 준비되면 프런트 버퍼와 스왑하기 때문에, 화면에 그림이 완전히 그려진 후에만 표시되어 플리커링이 발생하지 않습니다.
  2. 애니메이션과 같은 동적인 그래픽을 부드럽게 처리할 수 있습니다: 백 버퍼에 그림을 그리고 나서 프론트 버퍼와 스왑 하므로, 그림이 완전히 준비된 후에 한 번에 화면에 표시되기 때문에 부드러운 애니메이션을 구현할 수 있습니다.

 

728x90