본문 바로가기

Graphics

[이론] Single Buffering / Double Buffering / VSync / Triple Buffering

0. Raster Graphics System의 구조와 흐름

① GPU가 frame buffer(in graphic memory)에 계산된 이미지를 그린다.
② video controller가 frame buffer에 access하여 각 pixel의 r, g, b값 scan. 
③ digital-to-analog converter가 digital info -> analog info.
④ electron-beam gun이 screen의 phospher(형광인자)에 빛을 쏜다.
⑤ phospher가 받은 빛의 강도에 따라 환해졌다가 어두워진다. (무한 반복)

① : rendering 과정

② ~ ⑤ : display 과정

 

1. Computer Graphics 관점에서의 Frame Buffer

Frame buffer의 종류 설명
Color buffer Double buffer .
Stereo buffer 양쪽 눈에서 바라본 각각의 이미지를 생성하기 위해(입체감), left buffer&right buffer를 사용하여 각각 rendering한다.
Alpha buffer 몰라도 된다.
Depth buffer (Z-buffer) camera ~ object 간 거리를 측정 (깊이)
Stencil buffer pixel의 특별한 정보 저장 (고급효과)

 

2. Single Buffering (Color buffer 1개 사용)

GPU가 frame buffer에 계산한 이미지를 차례대로 그린다. (frame rate ,가변)

video controller는 frame buffer를 scan하면서 screen에 도시한다. (refresh rate, 고정)

→ frame rate과 refresh rate이 다른 경우, 이미지가 그려지는 도중에 screen에 도시되는 등 

불규칙한 이미지가 생성된다. (flickering)

 

3. Double Buffering (Color buffer 2개 사용)

GPU가 back buffer에 렌더링. (buffer writing)

video controller는 front buffer를 scan하여 screen에 도시한다. (buffer reading)

back buffer 렌더링이 종료될 때마다 front와 back의 역할을 바꿈 (buffer swapping)

→ video controller는 항상 완성된 이미지를 도시하기 때문에 flickering x

→ 일반적으로 frame rate > refresh rate 하여, 한번의 refresh에 여러 frame이 쪼개져서 보여질 수 있다. (screen tearing)

 

4. Double Buffering with VSync

VSync란 video controller가 refresh를 마친 시점에 buffer swapping이 일어나도록 하는 것이다.

→ video controller는 항상 완성된 이미지의 한 frame을 도시하기 때문에 screen tearing x

→ GPU가 idle상태로 refresh 완료를 기다리게 되므로 자원낭비, refresh rate이 렌더링 속도(frame rate)에 영향을 미치는 상황이 되어버린다. 결국 렌더링 시점과 디스플레이 시점 간의 지연이 발생한다.  (VSync lag)

→ 동일한 이미지가 여러번 디스플레이 될 수 있음. 화면이 변하는 속도가 달라지는 stuttering

 

5. Triple Buffering with VSync 

VSync시점 (refresh를 마친 시점)에 렌더링 끝난 back buffer 개수 video controller의 action
0개 front buffer의 내용을 한번 더 디스플레이
1개이상 가장 최근에 렌더링 끝난 back buffer의 내용을 디스플레이
(Most-recent buffer swapping 방식)

- GPU는 VSync시점에 이르기 전에 back buffer 렌더링 2개를 다하면, 먼저 렌더링 끝난 back buffer에 새롭게 렌더링 (VSyn lag ↓)

→ back buffer를 2개 사용하니까 동일한 이미지가 여러번 디스플레이 될 가능성이 ↓ (stuttering ↓, frame rate stabilization)