[WAYLAND] 더블 버퍼링 vs 트리플 버퍼링

오늘은 렌더링과 디스플레이 동기화와 관련하여 트리플 버퍼링(?)의 필요성에 대해 간단히 설명하고자 한다. 우선 아래 그림을 참고하면서 필요한 것들을 하나씩 알아보자.

triplebuffering

간단히 그림에서 사용하는 단어들의 의미를 짚어보자. (이전 글들에서 대부분 설명했던 것들이지만)

  • framebuffer[0-2].. 디스플레이에 출력될 화면 버퍼 (1920×1080 해상도와 4 byte 색상을 사용한다면 대략 8 mbyte 의 연속된 메모리를 의미)
  • scanout.. 디스플레이에 프레임버퍼를 전달 (60 hz 재생률을 사용한다면 초당 60 번 프레임버퍼를 전달)
  • vblank.. 다음 스캔아웃까지 대기하는 구간 (원래 의미는 구형 TV 에서 오른쪽 아래에 도착한 레이저빔이 왼쪽 위로 이동하는데까지 걸리는 시간)
  • rendering.. 프레임버퍼를 생성하는 과정 (rendering time 은 렌더링에 걸리는 시간 의미)

우선 기본적인 더블 버퍼링에 대해 알아보자. 대부분의 GUI 프로그램은 기본적으로 더블 버퍼링을 사용한다. 일반적으로 프론트(front) 버퍼는 마지막 화면 버퍼를 보관하고, 백(back) 버퍼는 다음 화면 버퍼를 만들기 위해 사용한다. 만약에 더블 버퍼링을 사용하지 않으면 어떻게 될까? 더블 버퍼링이 필요치 않은 경우도 존재하긴 하지만, 대부분의 경우에는 수정 중인 화면 버퍼가 디스플레이에 출력되는 불상사가 발생하게 된다. 이와 반대로, 더블 버퍼링을 사용 할 경우에는 항상 수정이 완료된 프론트 버퍼가 디스플레이에 출력된다고 보면 된다. 그리고 백 버퍼의 수정이 완료되면 프론트 버퍼와 백 버퍼가 교체되어 동일한 과정을 반복하게 된다.

사실 렌더링 시간이 vblank 보다 짧다면 위에서 설명한 더블 버퍼링만 가지고도 충분하다. 위 그림의 1번 경우처럼 아무 문제 없이 프론트/백 버퍼가 번갈아가면서 초당 60 번의 화면을 갱신하게 된다. 하지만, 레더링 시간이 vblank 보다 길어지면 어떻게 될까? 2번 경우처럼 백 버퍼를 수정하는 시간이 길어지면서 다음 스캔아웃에서도 이전 프론트 버퍼가 디스플레이에 출력된다. 즉, 초당 30 번 밖에 화면을 갱신하지 못 하게 되는 것이다. (부드러운 애니메이션 재생을 위해서는 최소 60 프레임은 지원하는게 좋다.)

이러한 경우에 사용할 수 있는게 바로 트리플 버퍼링이다. 위 그림의 3번을 보면 알겠지만, 일단 세 개의 프레임버퍼를 준비하자. 그럼 더블 버퍼링과 마찬가지로 하나는 프론트 버퍼가 되고, 나머지 두 개는 백 버퍼로 사용된다. 우선, 첫 번째 백 버퍼에 렌더링을 시작하자. 하지만 이 렌더링은 다음(첫 번째) 스캔아웃 때까지 완료되지 않기 때문에, 다음 스캔아웃 때는 이전 프론트 버퍼를 그대로 사용하고, 두 번째 백 버퍼에 다음 렌더링을 시작한다. 다음 렌더링 또한 다음(두 번째) 스캔아웃 때까지 완료되지 않겠지만 첫 번째 백 버퍼가 렌더링이 완료되었기 때문에 프론트 버퍼는 교체할 수 있다. 그리고 교체된 프론트 버퍼를 다시 백 버퍼로 활용하게 되면 이후부터는 초당 60 번의 화면 갱신이 가능해진다. 하지만 트리플 버퍼링을 사용하더라도 완벽한 것은 아니다. 왜냐하면 사용자가 어떤 입력을 넣었을 때 실제로 결과가 반영된 화면은 세 개의 vblank 를 지나서 나타날 것이기 때문이다. 이는 단순히 트리플 버퍼링으로 해결될 문제는 아니고, 디스플레이 동기화 방식과 렌더링을 시작하는 타이밍 등 다양한 사항을 고려해야만 최선의 결과를 찾을 수 있다.

위에서는 간단히 설명하기 위해 문제를 단순화시킨 것이고, 실제로는 렌더링 시간이 들쑥날쑥하기 때문에 이를 효과적으로 처리하기 위한 섬세한 알고리즘이 필요하다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중