프레임 버퍼와 더블 버퍼링 — 화면 뒤에 숨은 그림 창고 이야기

프레임 버퍼와 더블 버퍼링 — 화면 뒤에 숨은 그림 창고 이야기
여러분이 보는 컴퓨터 화면, 게임 화면은 사실 아주 빠르게 넘어가는 그림책이에요. 1초에 60장, 많게는 100장이 넘는 그림이 촤르륵 넘어가죠. 그런데 이 그림들은 어디에 보관되어 있다가 화면에 나올까요? 오늘은 그 비밀 창고인 프레임 버퍼와, 그림을 더 부드럽게 보여주는 마법인 더블 버퍼링을 알아볼 거예요. 언리얼 엔진 같은 게임 엔진도 모두 이 원리 위에서 돌아간답니다.
프레임 버퍼가 뭐예요? — 화면 전용 스케치북
프레임 버퍼(Framebuffer)는 컴퓨터 메모리(RAM)의 한 부분이에요. 이 안에는 화면에 보여줄 완성된 그림 한 장이 통째로 들어 있어요.
이렇게 생각해 보세요. 화면은 아주 작은 색깔 점(픽셀)이 촘촘하게 모여 만들어져요. 프레임 버퍼는 "1번 점은 빨강, 2번 점은 파랑, 3번 점은 노랑…" 하고 모든 점의 색깔을 적어 둔 커다란 색칠 공책이에요. 모니터는 이 공책을 그대로 읽으면서 화면에 색을 켜는 거죠.
그림 한 장을 프레임(frame)이라고 불러요. 그리고 잠깐 보관해 두는 창고를 버퍼(buffer)라고 해요. 그래서 "프레임 버퍼"는 "그림 한 장을 담아 두는 창고"라는 뜻이에요.
그림은 어떻게 화면까지 갈까?
순서는 간단해요. 먼저 그래픽 카드(GPU)가 열심히 그림을 그려요. 다 그린 그림은 프레임 버퍼라는 창고에 저장돼요. 그러면 모니터가 그 창고를 읽어서 우리 눈에 보여줘요. 요즘 그래픽 카드 안에는 이 창고 내용을 화면 신호로 바꿔 주는 회로가 함께 들어 있어요.
옛날 컴퓨터도 그림 창고가 있었어요
아주 옛날, 1950년대 컴퓨터는 지금 같은 메모리 칩이 없었어요. 대신 윌리엄스 튜브라는 유리 브라운관에 빛나는 점을 저장했어요. 신기하게도 저장된 점들이 눈에 보였기 때문에, 메모리 자체가 화면처럼 보이기도 했답니다. 아래 사진이 바로 그 모습이에요.

창고가 한 개뿐이면 생기는 문제
자, 이제 문제가 하나 생겨요. 창고(버퍼)가 한 개뿐이라고 상상해 봐요.
그래픽 카드는 그 창고에 새 그림을 그리고 있어요. 그런데 모니터는 같은 창고를 동시에 읽고 있어요. 그러면 어떻게 될까요? 위쪽은 새 그림인데 아래쪽은 아직 옛날 그림인, 반쯤 덜 그려진 이상한 화면이 보여요. 게임 화면이 가로로 찢어진 것처럼 보이는 "티어링(찢어짐)" 현상이 바로 이거예요.
친구에게 그림을 보여주는데, 색칠을 반만 한 상태에서 들켜 버리는 것과 같아요. 창피하죠!
더블 버퍼링 — 창고를 두 개로 늘리자!
해결 방법은 의외로 간단해요. 창고를 두 개 만드는 거예요. 이것이 더블 버퍼링(Double Buffering)이에요.
- 앞 버퍼(프론트 버퍼): 모니터가 지금 보여주고 있는 완성된 그림
- 뒤 버퍼(백 버퍼): 그래픽 카드가 몰래 다음 그림을 그리는 곳
연극 무대와 똑같아요. 관객은 무대 위 장면만 봐요. 그동안 무대 뒤에서는 배우들이 다음 장면을 열심히 준비하죠. 준비가 끝나면? 순식간에 싹 바꿔치기(스왑)해요. 관객은 준비하는 어수선한 모습을 전혀 못 봐요. 항상 완성된 장면만 보게 되죠.
뒤 버퍼에서 그림이 완성되면, 두 창고의 역할을 서로 바꿔요. 뒤 버퍼는 앞 버퍼가 되어 화면에 나오고, 원래 앞 버퍼는 뒤 버퍼가 되어 새 그림을 그리는 자리가 돼요. 이걸 계속 반복하면 관객(우리)은 언제나 완성된 그림만 보게 됩니다.
한 걸음 더 — 트리플 버퍼링
창고를 세 개 쓰는 방법도 있어요. 트리플 버퍼링이라고 해요. 창고가 하나 더 있으니 그래픽 카드가 기다리는 시간이 줄어서, 그림을 더 쉬지 않고 그릴 수 있어요. 대신 메모리를 더 많이 차지하죠. 아래 그림은 창고를 1개, 2개, 3개 썼을 때 시간이 어떻게 흘러가는지 비교한 거예요.

언리얼 엔진과 무슨 상관이 있나요?
언리얼 엔진으로 게임을 만들면, 엔진이 매 순간 캐릭터와 배경을 그려서 뒤 버퍼에 저장해요. 그리고 화면 갱신 타이밍에 맞춰 앞 버퍼와 교체하죠. 게임 설정에서 보는 "수직 동기화(VSync)" 옵션이 바로 이 교체 타이밍을 모니터 박자에 맞출지 정하는 스위치예요. 박자를 맞추면 화면 찢어짐이 사라지고, 대신 아주 약간 반응이 느려질 수 있어요.
이런 프레임 버퍼 기능은 아래 사진 같은 그래픽 카드 속 회로가 담당해요. 옛날에는 프레임 버퍼가 이렇게 따로 꽂는 큰 카드였지만, 지금은 그래픽 카드 안에 쏙 들어가 있답니다.

오늘 배운 것 정리
- 프레임 버퍼는 화면에 보여줄 그림 한 장을 통째로 담아 두는 메모리 창고예요.
- 창고가 하나뿐이면, 그리다 만 그림이 보여서 화면이 찢어져 보일 수 있어요.
- 더블 버퍼링은 창고를 두 개 만들어, 뒤에서 몰래 다 그린 뒤 순식간에 바꿔치기하는 방법이에요.
- 트리플 버퍼링은 창고 세 개로 더 부드럽게, 대신 메모리를 더 쓰는 방법이에요.
- 언리얼 엔진 게임의 부드러운 화면도 모두 이 원리 덕분이에요.
다음에 게임을 하다가 화면이 부드럽게 움직이면, 무대 뒤에서 쉴 새 없이 그림을 바꿔치기하는 두 개의 창고를 떠올려 보세요!
출처
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기