|
2014-02-06 21:06
조회: 28,457
추천: 8
수직동기화와 삼중버퍼링에 대한 모든것이 글로 모든 의문이 해소되길 기대해봅니다.
삼중 버퍼링(triple buffering)이란 말 뜻을 잘 생각해보면 이중 다음이 삼중이니까, 3개란 뜻이겠고, 버퍼링은 버퍼를 둔 다는 뜻인거 같으니 3개의 버퍼라고 생각하면 될 것 같습니다.
비디오 카드 옵션을 아무리 살펴봐도 이중 버퍼링이 없는데 왜 뜬금없이 바로 삼중 버퍼링일까요?
OpenGL, Direct3D에서는 현재 우리가 보고 있는 화면이 표시되고 있는 영역이 프론트 버퍼[front buffer]라고 하고 보이지는 않지만, 앞으로 보일 화면이 백 버퍼[back buffer]라고 합니다. 모니터는 항상 [front buffer]에 있는 내용 그대로를 화면에 표시 합니다.
[back buffer]를 따로 두는 이유는, [front buffer]에 그림을 바로 그려버릴 경우에 그려지는 과정이 모니터에 다 표시되기 때문 입니다. 느린 컴퓨터에서 응용 프로그램을 실행하면 제목이나 창틀, 메뉴의 선이 하나씩 그려지는게 보이는 경우가 있죠. 이와 같은 현상이 생기지 않게 하기 위해서 완전한 그림을 그리기 전까지 작업은 [back buffer]에서 하게 됩니다. 게임에서 캐릭터 따로 그려지고 배경 따로 그려지고 하면 꼴사납겠죠. 게다가 화면이 반짝이는 문제가 생깁니다.
그러면 삼중 버퍼란 이미 존재하는 더블 버퍼에 버퍼를 하나 더 추가한다는 말이겠죠. 이제 버퍼를 왜 추가해야 하는지에 대하여 알면 삼중 버퍼에 대한 모든 것을 아셨다고 생각하시면 됩니다.
화면 짤림을 방지하기 위해 수직 동기화 대기 옵션을 만들고 보니 재생빈도 만큼 GPU 성능이 따라가지 못하면 다음 수직 동기 대기 신호까지 GPU가 대기하고 있어야 해서 성능이 떨어지는 문제점이 생겼습니다.
이제 그림을 보시지요. (그리느라 힘들었습니다 ㅎㅎ)
(1) 재생빈도보다 [back buffer] 그리는 시간이 짧을 경우에 수직 동기화 대기의 작동 모습
(노란 영역만큼 GPU는 놀고 있게 됩니다)
(2) 재생빈도보다 [back buffer] 그리는 시간이 길어질 경우에 수직 동기화 대기의 작동 모습
위의 (1)의 경우에는 재생빈도보다 프레임을 그리는 시간이 짧아서 수직 동기화 대기를 켜도 문제가 없지만 (2)의 경우에는 재생빈도보다 프레임 그리는 시간이 길어서 [back buffer]에 그리는 동안 수직 동기화 신호를 놓치게 되고 결국 다음 신호까지 또 기다려야 하므로 한 장의 그림에 2번의 대기 신호를 가지게 되므로 결국 프레임이 전체 재생빈도의 절반이 되어 버리는 현상이 생기는 것 입니다.
이 대기 현상을 해결하기 위해 개발자들은 삼중 버퍼링이라는 것을 생각해내게 되는데 수직 동기화 대기를 마냥 기다리지 않고 일단 삼중 버퍼[triple buffer]에 [back buffer]를 옮겨 놓았다가 수직 동기화 신호 타이밍이 되면 [triple buffer]의 내용을 [front buffer]로 옮기는 것 입니다. 그러므로 [back buffer]는 수직 동기 신호와 상관없이 새로운 그림을 그릴 수 있게 되어 조금 더 유연한 작업을 가능하게 해주는 것이죠.
위의 (2)의 경우 삼중 버퍼링을 활성화 시키면 아래와 같은 상황이 됩니다. 빨간색으로 표시된 영역에서 [back buffer]의 내용을 잠시 보관했다가 수직동기화 타이밍이 되면 데이터를 [front buffer]에 전송해주므로 GPU가 대기를 할 필요가 없게 되어 프레임 한 장을 그리는데 동일한 시간이 필요하지만 전체 프레임은 5 에서 8 로 올라간 것을 알 수 있습니다.
수직 동기를 켜면 프레임이 절반이 된다. 아니면 성능이 떨어진다 말 들이 많았지만, 결국 삼중 버퍼링이란 기술이 있기 때문에 다 옛날 이야기가 되어 버린 것 입니다.
삼중 버퍼링 옵션은 고급 설정에 찾아보면 있으며, 기본값은 off 입니다.
위에서 살펴 보았듯이 삼중 버퍼링은 수직 동기화 대기 상태에서 프레임을 끌어 올리는 매우 훌륭한 기능인데 왜 기본값이 on 이 아니고 off 일까요? 무조건 켜면 좋은 것은 아닐까요?
(3) 재생빈도보다 [back buffer] 그리는 시간이 짧은 상태에서 삼중 버퍼를 쓸 경우
위의 (3)의 경우에서 어느 시점까지는 삼중 버퍼 때문에 대기 시간이 없어지지만, GPU 처리 성능이 너무 빨라서 4 프레임 이후에는 삼중버퍼도 꽉차서 보관 할 수 없는 상태가 되어서 (1)과 다를 바가 없어진 것이지요. 문제는 이렇게 1 프레임씩 삼중 버퍼에 있다가 출력이 되면 화면 재생빈도 간격 만큼 반응 속도가 느리다는 이야기가 됩니다.
삼중 버퍼 때문에 갓 만든 화면이 아니라 아까 만든 화면이 나오는 것이지요. 보통 60Hz 재생빈도에서는 1초가 1000ms 이니까 1000을 60으로 나눠서 16.67ms 만큼의 딜레이가 생기는 것 입니다. 일반적인 상황에서는 상관 없을지도 모르겠지만, FPS 같은 반응 속도에 플레이어의 목숨이 걸려있는 게임에서는 큰 값이죠.
결국 이 값도 게임과 자신이 가지고 있는 GPU 성능에 따라서 탄력적으로 조절해야 하는 값 입니다. 그리고 수직 동기화 대기가 꺼져 있는 상태에서는 의미가 없습니다. (개인적으로 전역 드라이버 설정에서는 수직 동기, 삼중 버퍼링 모두 ON 을 추천 합니다.)
EXP
39,132
(4%)
/ 42,001
|




엄마이갓