Blog

ENGINEERING NOTE

[Unreal Engine] Double Buffer

해당 포스팅은 Stuart Butler , Tom Oliver의 Game Development Patterns with Unreal Engine 5를 바탕으로 작성한 내용입니다.추가 참고 자료 : Game Programming Patterns : Double Buffe

Unreal Engine
해당 포스팅은 Stuart Butler , Tom Oliver의 Game Development Patterns with Unreal Engine 5를 바탕으로 작성한 내용입니다.

컴퓨터는 어떻게 화면을 그릴까?

컴퓨터 모니터와 같은 디스플레이 장치는 한 번에 한 픽셀(pixel)씩 화면을 그린다. 픽셀을 왼쪽에서 오른쪽으로 한 줄 그린 뒤, 다음 줄로 내려가는 방식으로 이동하며, 오른쪽 아래 끝에 다다르면 다시 위로 올라가 반복한다.

이 과정을 초당 약 60번 반복하기 때문에 우리는 화면이 깜빡거리거나 그려지는 과정을 보지 못하고 그저 정적인 이미지처럼 느끼게 된다.

대부분의 컴퓨터에서는 디스플레이가 프레임버퍼(framebuffer)에서 색 정보를 가져온다. 프레임버퍼란 한 화면의 모든 픽셀을 저장해 놓은 메모리 공간(RAM 배열)이며, 각 픽셀의 색값이 특정 바이트 단위로 저장되어 있다.

디스플레이는 이 프레임버퍼의 값을 한 바이트씩 읽어 모니터에 픽셀을 그려낸다.

단일 버퍼일 때의 문제

하지만 앞서 말했듯 컴퓨터는 순차적이다. CPU가 렌더링 코드의 일부를 실행 중일 때, 다른 일을 동시에 하고 있으리라 기대하지 않는다.

그래도 우리 프로그램이 실행되는 동안 디스플레이 드라이버는 계속해서 프레임버퍼를 읽고 있다. 바로 그 때문에 문제가 생긴다.

예를 들어, 화면에 해피 페이스(웃는 얼굴)를 그리려고 한다고 해보자. 프로그램은 프레임버퍼의 픽셀을 하나씩 채워 넣기 시작한다.

문제는, 비디오 드라이버가 우리가 그 픽셀을 쓰는 바로 그 순간에 프레임버퍼를 읽고 있다는 점이다.

드라이버가 우리가 이미 그린 픽셀을 읽어 가면서 얼굴의 일부가 나타나기 시작하지만, 곧 렌더링 속도를 추월하여 우리가 아직 그리지 않은 부분을 읽게 된다.

그 결과 화면에는 반쯤 그려진 이미지, 즉 티어링(tearing)이 발생한다.

이러한 문제점을 방지하고자 Double Buffering 기법이 등장하게 되었다.


더블 버퍼(Double Buffer)란?

더블 버퍼는 이름 그대로 두 개의 버퍼(Back Buffer + Front Buffer)를 번갈아 사용하는 방식이다.

  • Front Buffer (화면에 출력 중)
  • Back Buffer (그리는 중, 렌더링 작업이 이루어지는 곳)

GPU는 Back Buffer에 그리기를 끝낸 뒤, 두 버퍼를 Swap(교체) 한다. 이 덕분에 화면은 완성된 이미지만 보여줄 수 있다.

Graphics API에서의 Double Buffer

DirectX 12와 같은 현대 그래픽 API에서 더블 버퍼링은 Swap Chain을 통해 구현된다. 물론 언리얼 엔진에서도 이러한 더블 버퍼 프로세스를 사용할 수 있도록 내장되어 있다.

💡 Swap Chain이란?

Swap Chain은 GPU가 렌더링한 Back Buffer와 화면에 출력되는 Front Buffer를 관리하는 구조다. GPU는 Back Buffer에 다음 프레임을 렌더링하고 프레임이 완성되면 Swap Chain을 통해 Back ↔ Front Buffer를 교체(Swap) 한다. 이 과정을 통해 사용자에게 완성된 프레임만 화면에 보여줄 수 있다.

게임에서의 Double Buffer

그래픽적인 관점에서 쓰였던 Double Buffer는 게임 내에서도 충분히 사용될 수 있다.

예를 들어, 멀티스레드 환경에서 AI 상태, NPC 행동, 이벤트 큐를 업데이트할 때도 더블 버퍼를 쓸 수 있다.

  • 메인 스레드는 CurrentState를 읽어 게임에 적용
  • 워커 스레드는 NextState를 계산

프레임 끝에 두 버퍼를 교체

이렇게 하면 멀티스레드 경쟁 조건(race condition)을 줄이고, 프레임 단위로 일관된 게임 상태를 유지할 수 있다.

이외에도 게임에서 데이터/코딩 관점의 Double Buffer는 다음과 같은 목적에 사용된다.

  • 읽기/쓰기 충돌 방지
  • 멀티스레드 환경에서 경쟁 조건 최소화
  • 히트맵 분석, 데이터 수집
  • 네트워크/이벤트 큐 동기화 안전성 확보 등

즉, 그래픽뿐만 아니라 게임 상태, 이벤트, 물리, AI 등 다양한 데이터 구조에서 안정적인 처리 패턴으로 활용된다.