Raster Graphics System

맨 처음에 processor(CPU) 가 장면을 계산함
계산한 그래픽스 데이터를 memory에 저장함
GPU는 이걸 읽고 처리할거임
GPU는 그래픽스 데이터를 받아서 직접 이미지를 그림
이 결과가 Frame Buffer에 저장된다
Video Controller는 Frame Buffer에 저장된 데이터를 주기적으로 읽음
읽는 방식은 프레임 버퍼의 시작 주소부터 읽기 시작해서 한 줄(좌 → 우)로 차례대로 읽음.
줄 끝에 도달하면 다음 줄로 내려감
프레임 전체를 다 읽는 걸 한 프레임을 다 읽었다고 함
한 프레임을 다 읽어야만 내 화면에 나타나는 것.
이걸 디지털/ 아날로그 신호로 바꿔서 모니터에 출력함.
비디오 컨트롤로가 프레임 버퍼를 레스터 스캔하고 있는데, GPU가 해당 프레임 버퍼의 내용을 덮어써서 새로운 프레임 데이터를 써버리는 상황이 발생할 수 있음.
⇒ 스크린 티어링
Frame Buffer
프레임 버퍼는 그래픽스에서 처리 중인 이미지 데이터를 저장하는 용도로 사용한다.
화면에 출력할 래스터 이미지와 관련된 데이터들을 저장해 준다.
색상 뿐만 아니라 렌더링에 필요한 다양한 정보를 포함함.
Color Buffer
각 픽셀의 RGB값을 저장하는 버퍼
- Double Buffer: 두개의 버퍼(front/back)로 화면 깜빡임 없이 애니메이션 처리함.
- Stereo Buffer: 입체 영상용 좌/우 시야 버퍼
- Alpha Buffer: 픽셀의 투명도(알파값) 저장
Depth Buffer (Z-buffer)
각 픽셀마다 카메라로부터의 거리 값을 저장함.
화면에 두 물체가 겹친 상황을 생각해보면 어떤 녀석이 앞에 있어야 하는가에 대한 판단이 필요하기 때문
(css에서 z-index 생각하면 비슷하게 다가와짐)
Stencil Buffer
렌더링 할 수 잇는 영역을 제한할 때 사용하는 버퍼
어디에는 그리고 어디에는 그리지 말지 지정할 수 있는 마스크 같은 역할 한다
Single Buffering
하나의 Color Buffer만 사용해서 렍더링과 화면 출력을 동시에 처리하는 방식
CPU가 새로운 프레임을 계산하면 계산된 내용을 프레임 버퍼에 그림.
동시에 비디오 컨트롤러는 이 프레임 버퍼에서 픽셀을 읽고 화면에 보이도록 함
위 과정이 동시에 일어난다.
이러면 동시에 같은 공간을 접근하고 있으면서 서로의 상태를 신경 쓰지 않는 독립적인 구조이기 때문에 내 화면에는 그리다가 만 상태가 나타날 수 있
CPU는 프레임 버퍼에 그림을 차례대로 그리고 있음
그린데 비디오 컨트롤러는 그림이 완성되지 전에 프레임 버퍼를 읽고 화면에 보여줌
⇒ Flickering
Double Buffer
더블 버퍼는 2개의 컬러 버퍼를 사용해서 하나는 화면에 보여주기 용으로만 쓰고, 나머지 하나는 그리는 용도로만 쓰는 방식
두 버퍼를 프론트 버퍼, 백 버퍼라고 함
- GPU가 백 버퍼에 그림을 그림
- 동시에 비디오 컨트롤러는 프론트 버퍼에서 픽셀을 읽어서 화면에 출력함
- GPU가 백 버퍼에 그림을 다 그리면 두 버퍼를 교체함
- 그러면 비디오 컨트롤러는 그림이 다 완성된 프론트 버퍼(방금 전까지 백 버퍼 였던 녀석)를 그림
비디오 컨트롤러의 입장에서는 항상 완성된 그림을 탁 탁 그리는 기분을 느낌
그런데 GPU는 렌더링이 끝나는 대로 백 버퍼랑 프론트 버퍼를 바꿈.
만약 여기서 비디오 컨트롤러가 버퍼를 읽는 중이었을 수 있음.
그러면 위쪽은 이전 프레임을 읽고 아래쪽은 새로운 프레임을 읽게 됨
⇒ 화면이 수평으로 찢어진 듯한 그림을 볼 수 있다
⇒ 스크린 티어링
프론트 버퍼와 백 버퍼의 교체와 비디오 컨트롤러의 리프레시 주기가 일치하지 않아서 생긴 문제
⇒ VSync 사용!!

GPU가 백 버퍼에 그림을 다 그렸더라도 비디오 컨트롤러가 프레임 버퍼를 읽는 중이라면 프론트 버퍼와 백 버퍼를 교체하지 않고 대기함.
그런데 이렇게 하면 GPU가 띵가띵가 노는 상황이 생길 수 있다.
게다가 어쩌다가 박자가 길게 어긋나면 똑같은 이미지가 오랫동안, 여러번 보여질 수 있음
⇒ 스터터링!!!
한 마디로 렉 걸리는 것처럼 보이게 된다. 프레임률이 낮아지니까
Tripple Buffering
걍 백 버퍼 하나 더 늘려서 GPU가 놀지 못하게, 일을 더 시킴.
VSync 끝난 시점에 GPU가 완성한 백 버퍼가
- 0개: 기존 이미지 한 번 더 그림
- 1개 이상: 가장 최근에 렌더링 완료한 백 버퍼랑 교체
- 2개: GPU가 두 백 버퍼 중에서 일찍이 그림을 다 그림 백 버퍼에 다시 그림을 그림 (최신화 작업이라고 생각하면 될 듯)
이렇게 하면 GPU는 놀면서 자원 낭비 안 할 수 있고, 렉도 줄일 수 있다!