2 minutes
❎ Direct3D 11 Graphics Pipeline - 9. 프레임과 게임 루프
1. Frame(프레임)
화면에서 한 번 그려지는 화면의 이미지
Frame Update(프레임 갱신): 매 순간 변화된 게임 상태(캐릭터 위치, 애니메이션 등)를 실제 화면에 반영하여 그리는 과정
예시: 캐릭터가 오른쪽으로 걸어갈 때, 한 번의 프레임마다 조금씩 오른쪽으로 이동하는 모습이 그려짐
- 이 때, 프레임 갱신은 매번 캐릭터가 조금 이동한 새로운 이미지를 만들어서 게임 화면에 표시해주는 과정
FPS(Frame Per Second)
초당 얼마나 많은 프레임이 그려지는 지를 나타내는 값
- 예를 들어 FPS가 60이라는 뜻은 1초에 60장의 프레임을 그리고 있다는 뜻
프레임이 높을 수록 게임 움직임이 더 부드럽게 보이며, FPS가 낮다면 성능에 문제가 있거나 그래픽이 무거워 기기가 감당하기 힘들다는 것을 의미
2. Frame Buffer(프레임 버퍼)
컴퓨터 그래픽스에서 현재 화면에 표시할 픽셀 데이터를 저장하는 메모리 공간
각 픽셀의 색상 정보(RGB)와 부가 정보(A)를 담고 있음
GPU는 프레임 버퍼 업데이트를 통해 화면에 렌더링 수행
Direct3D 11에서는 보통
ID3D11Texture2D로 프레임 버퍼 생성- 이를 Render Target View(RTV,
ID3D11RenderTargetView)로 감싸서 렌더링에 사용
- 이를 Render Target View(RTV,
역할
최종 화면 저장: 화면에 그려질 최종 이미지를 보관하며, 이는 사용자가 보는 화면과 일치
픽셀 데이터 관리: 각 픽셀의 정보(RGB + A(선택적))를 관리
렌더링 결과 전달: GPU가 장면을 렌더링하여 프레임 버퍼에 저장하고, 디스플레이 장치가 이를 읽어 화면에 표시
부가 데이터
프레임 버퍼는 단순히 색상 데이터만 저장하는 것이 아니라 추가적인 데이터를 포함할 수 있음
Depth Buffer: 각 픽셀의 깊이 값을 저장하여 Depth Test에 활용
Stencil Buffer: 특정 영역의 렌더링을 제어하거나 마스킹하는 데에 활용
3. Double Buffering(더블 버퍼링)
프레임 버퍼는 보통 더블 버퍼링 기법과 함께 사용되며, 프론트 버퍼와 백 버퍼를 교체(swap)하여 부드러운 화면을 구현함
화면의 깜빡임(flickering)이나 깨짐(tearing) 현상을 완화하고, 부드러운 그래픽을 보여주기 위해 사용되는 기술
컴퓨터는 화면에 그림을 그릴 때 한 줄씩, 차례대로 그리는데, 하나의 프레임 버퍼만 사용하다보면 이 과정에서 새 그림을 그리는 중간 상태가 화면에 노출될 수 있음
- 그 결과 flickering이나 tearing이 발생
화면을 그리는 작업 공간(백 버퍼)과 보여주는 작업 공간(프론트 버퍼)을 분리하여 효율적으로 처리하는 방법
그리는 중간 과정을 사용자가 보지 못하도록, 새 그림은 백 버퍼에 그리고, 그림이 완성되면 프론트 버퍼와 백 버퍼를 교체(swap)하는 방식을 반복 수행
Direct3D 11에서는 프론트 버퍼, 백 버퍼를 코드에서 직접 관리하는 것이 아니고 DXGI의 스왑 체인이 내부적으로 알아서 관리하며, 사용자는 화면에 그릴 프레임 버퍼만 신경쓰면 됨
4. 게임 루프(메인 루프, Main Loop)
게임이 실행되는 동안 계속 반복되는 핵심 반복문
해당 루프 안에서 게임 로직 업데이트, 입력 처리, 충돌 판정, 화면 그리기 등의 작업이 매 프레임마다 수행
기본 흐름
while (게임이 실행 중): # 1. 입력(키보드, 마우스 등) 처리 handleInput() # 2. 게임 로직(캐릭터 이동, AI, 물리 엔진, 점수 계산 등) 업데이트 updateGameLogic() # 3. 화면 그리기(렌더링 / 프레임 갱신) render() # 4. (필요 시) FPS 조절을 위한 대기 waitForNextFrame()