더블 버퍼링,수직동기화

2023. 6. 25. 12:59Public/Graphics

 

 

주로 컴퓨터 그래픽에서 사용되는 용어로서 비디오 메모리만을 사용한 싱글 버퍼링으로 그래픽을 그릴 경우 데이터를 저장하는 동안에는 다음 그림의 데이터를 전송할 수 없기 때문에 지우고 그리고 지우고 그리고 할 경우 필연적으로 발생하는 깜빡임, 찢어짐 등의 상황을 막기 위해서 사용되는 기법이다.

싱글 버퍼링은 비디오 메모리(프론트 버퍼)만을 사용하는데 반하여 예비 버퍼(백 버퍼)를 두어 먼저 버퍼2에 그림을 보내고 그것을 다시 버퍼1로 보낸 다음 버퍼 1의 데이터를 처리하는 동안 다시 버퍼 2에 그림을 보내면 데이터의 전송과 처리가 막히는 일이 없어져서 깜빡임 현상이 사라지게 되는 것이다.

그래서 비단 게임 뿐만이 아니라 그림을 띄워야 하는 프로그래밍을 해야 할 경우에는 반드시 더블버퍼링 API를 찾아보고 적용하는 일이 필요하다. 

단 이 더블 버퍼링도 만능은 아니어서, 만약 그리기 연산의 처리에 지연이 생긴다면 프론트 버퍼에 남아있는 그림이 계속 보이게 되어 화면이 밀리는 현상이 나오게 된다. 그래서 이를 해결하기 위해 애당초 그림을 널찍하게 그리는 수직동기화 방법과 백버퍼를 하나 더 추가하여 백버퍼의 데이터를 교대로 받아오는 삼중버퍼링 기법이 생겨나게 되었다.

 

더블 버퍼링 그 자체만으로는 스크린 테어링을 제거하지 못한다. 스크린 테어링은 게임이 버퍼X로 쓰기 시작하려고 할 때 디스플레이가 버퍼 X를 그리고 있는 중이라면 여전히 발생한다. 이 상황은 오직 게임이 너무 빨리 업데이트되는 경우에만 일어난다. 문제에 대한 해결책은 디스플레이가 버퍼를 교환하기 전에 자신이 사용하고 있는 버퍼를 모두 그릴 때까지 게임이 기다리는 것이다. 다시 말해 게임이 버퍼를 교체하길 원할 때 디스플레이가 여전히 버퍼 X를 그리고 있다면 게임은 디스플레이가 버퍼 X를 다 그릴 때까지 기다려야 한다. 개발자는 이 접근법을 수직 동기화(vertical synchronization)또는 화면을 새로 갱신하려 할 때 모니터가 보내는 신호의 이름을 따서 vsync라 부른다.

 

수직 동기화를 사용하면 게임은 디스플레이가 준비될 때까지 짧은 시간 동안 대기해야 한다. 이는 게임 루프가 정확하게 30또는 60프레임 레이트를 달성할 수 없다는 것을 뜻한다. 일부 플레이어는 vsync 때문에 프레임 레이트가 저하돼 받아들일 수 없을 정도의 버벅거림을 일으킨다고 주장한다. 그래서 vsync의 활성화 여부는 게임이나 플레이어의 성향에 따라 달라질 수 있다. 좋은 아이디어는 엔진에서 vsync를 옵션으로 제공해서 가끔씩 발생하는 스크린 테어링이나 버벅거림 조정을 선택할 수 있게 해주는 것이다.

 

또한 진보된 최근의 디스플레이 기술에서는 게임에 따라 변화하는 적응적 화면 재생 빈도(adaptive refresh rate)로 이 딜레마에 대한 해결책을 찾고 있다. 이 방법에서는 디스플레이가 화면을 갱신하려 할 때 게임에 통지하기보다는 게임이 디스플레이로 언제 화면을 갱신해야 할지를 알려준다. 이렇게 하면 게임과 디스플레이의 동기화가 가능해진다. 이 솔루션은 스크린 테어링과 프레임 레이트 버벅거림을 제거한 2가지 장점을 모두 제공한다. 하지만 현재 이 책을 쓰는 시점에서 적응적 화면 재생 빈도 기술은 특정 고급 컴퓨터 모니터에서만 이용할 수 있다.

 

 

'Public > Graphics' 카테고리의 다른 글

[Node] Attribute Create[geometry]  (0) 2023.09.01
[Node]Platonic Solides  (0) 2023.09.01
색상버퍼(ColorBuffer),색상깊이(ColorDepth),RGBA  (0) 2023.06.25
레스터 그래픽스 - raster graphics (벡터,래스터)  (0) 2023.06.25
Z Buffer  (0) 2022.07.25