[그래픽스] 애니메이션과 더블 버퍼링

애니메이션과 더블 버퍼링

일반적인 비디오 카드에서 프레임버퍼는 2중 포트 구조다.

위와 같이 그래픽 프로세서에서 프레임 버퍼에 영상을 써나가고 비디오 컨트롤러는 프레임 버퍼에 쓰인 내용을 읽어서 화면에 뿌리는 역할을 담당한다.

위 과정에서 그래픽 프로세서가 프레임 버퍼에 영상을 쓰는 속도는 느리고 비디오 컨트롤러가 프레임 버퍼를 읽는 작업은 빠르다

이같은 속도 차이는 짧은 시간 간격을 두고 지속적으로 물체 영상이 바뀌어야 하는 애니메이션에서 문제가 된다.

비디오 컨트롤러의 재생 속도가 빠르면 이전 화면에서 현재 화면으로 전환되는 과정에서 부자연스러움이 나타날 수 밖에 없다.

이 같은 차이를 해결하기 위해 더블 버퍼링이라는 개념이 나왔다.

더블 버퍼링

프런트, 백 버퍼라 불리는 이 버퍼들은 각각 영상 하나를 온전히 저장할 수 있는 용량을 갖고 있다. 비디오 컨트롤러가 프런트 버퍼의 내용을 읽고 출력하는 동안 그래픽 프로세서가 백 버퍼에 내용을 써 나간다. 그래픽 프로세서가 쓰기를 완전히 마치면 비디오 컨트롤러가 백 버퍼로 스위칭하여 새롭게 기록된 내용을 읽는다. 동시에 그래픽 프로세서는 이전 프론트 버퍼로 스위칭하여 다시 내용을 써나간다.

현재 비디오 컨트롤러가 읽고 있는 버퍼를 프런트 버퍼로 정의하고, 현재 화면에는 내용이 보이지 않지만 그래픽 프로세서가 기록 중인 버퍼가 백 버퍼다. 따라서 버퍼는 프런트 버퍼와 백 버퍼를 반복한다.

더블 버퍼링은 두배의 메모리가 필요하다. 어떤 버퍼가 화소당 R,G,B,A 각각 8비트씩 할당하고, 해당 화소에 맺히는 물체의 깊이 정보를 저장하기 위해 16비트 깊이 버퍼를 할당한다고 가정해보자.

이렇게 되면 한 화소당 총 48비트가 필요하다. 여기서 더블 버퍼링을 사용하려면 총 96비트가 필요하다.