2. 의도
여러 순차 작업의 결과를 한 번에 보여주기 위해 사용
예를 들어, 게임 렌더링 시 여러 번에 걸쳐서 그린 내용
을 한번에 출력해서 보여줘야 한다
3. 화면 찢김 현상 Tearing
프레임 버퍼에 그릴 내용을 입력하고 화면을 출력할 때
프레임 버퍼를 읽어서 보여준다 이 때, 프레임 버퍼에
내용을 미처 다 쓰기 전에 비디오 드라이버가 버퍼를
읽어서 화면을 출력하면 발생 할 수 있다
4. 화면 찢김 현상 Tearing
요구사항
비디오 드라이버는 작업이 완료된 버퍼를 읽을 수
있어야 한다
그릴 데이터를 입력할 때는 하나씩 입력할 수 있어야
한다
5. 1막 1장
요구 사항
1장에서 2장으로 넘어갈 때 무대가 바뀌어야 한다
끊김 없이 바꿀 수 없을까?
해결 방안
무대를 2개 준비한다(A무대:1장, B무대:2장)
1장이 끝나면 A무대 조명을 모두 끄고 B무대 조명
을 켠다 그리고 2장 시작
2장을 하는 동안 A무대에 3장 무대를 준비한다
6. 화면 찢김 현상 Tearing
해결방안
프레임 버퍼를 두 개 준비해, 하나의 버퍼에는 현재
보여줘야 되는 값을 둬서 GPU가 언제든지
읽을 수 있도록 한다
그동안 렌더링 코드는 다른 프레임 버퍼를 채운다
렌더링 코드가 다 그린 후에는 버퍼를 교체한 뒤
비디오 하드웨어에게 두 번째 버퍼를 읽으라고
알려준다
그리고 이전 버퍼에 다음 프레임에 출력할 화면을
그린다
7. 패턴
버퍼 클래스는 버퍼를 캡슐화 하여 현재 버퍼,
다음 버퍼 두 개의 버퍼를 가진다
정보를 읽을 때는 현재의 버퍼를 알려준다
정보를 쓸 때는 다음 버퍼에 수정한다
정보를 다 쓰고 난 뒤에 현재 버퍼와 다음 버퍼를
교체 한다
현재 버퍼는 새로운 다음 버퍼가 되어 재사용 된다
8. 언제 쓸 것인가?
순차적으로 변경해야 하는 상태가 있다
렌더링 코드가 하나씩 그림
이 상태는 변경 도중에도 접근 가능해야 한다
GPU는 언제든 프레임 버퍼에 접근할 수 있어야
한다
9. 언제 쓸 것인가?
바깥 코드에서 작업 중인 상태에 접근 할 수 없어야
한다
렌더링 중인 버퍼에는 접근 하면 안 된다
상태에 값을 쓰는 도중에도 기다리지 않고 바로
접근할 수 있어야 한다
GPU는 언제든 프레임 버퍼에 접근할 수 있어야
한다
10. 주의사항
교체 연산 자체에 시간이 걸린다
버퍼 교체 시 외부에서 두 버퍼에 접근 할 수 없어야
되기 때문에 버퍼 교체 연산이 빨라야 한다
버퍼가 두 개 필요하다
그만큼 메모리를 더 요구한다
26. 디자인 결정
버퍼를 어떻게 교체할 것인가?
포인터나 레퍼런스 교체
빠르다
버퍼 코드 밖에서는 메모리를 포인터로
가질 수 없다
항상 현재의 버퍼를 가리키는 메모리를 읽어야 한다
버퍼에 남아있는 데이터는 직전 프레임이 아니라 2
프레임 전의 데이터이다
버퍼에 남은 데이터를 재사용 해야 할 때 주의
(ex. 모션 블러)
27. 디자인 결정
버퍼를 어떻게 교체할 것인가?
데이터 복사
다음 버퍼에는 딱 한 프레임 전의 데이터가
들어있다
이전 버퍼에서 좀 더 최신 데이터를 얻을 수 있다
교체 시간이 더 걸린다
28. 디자인 결정
얼마나 정밀하게 버퍼링 할 것인가?
버퍼가 한 덩어리라면
간단히 교체할 수 있다
버퍼가 두 개 밖에 없기 때문에 포인터 연산으로
빠르게 교체 가능
29. 디자인 결정
얼마나 정밀하게 버퍼링 할 것인가?
여러 객체가 각종 데이터를 들고 있다면
교체가 느리다
전체 객체 컬렉션을 순회해야 하기 때문