이미지 더블버퍼링(이중버퍼링) 개념

영상 스트리밍에서의 버퍼

우리가 보는 영상은 카메라(이미지센서)로부터 입력받아서 디스플레이로 출력된다. 이때 카메라로부터 입력받은 이미지들은 내부적으로 영상처리 과정을 거쳐야하고, 입력장치(카메라)와 출력장치(디스플레이)의 속도차이로 인해 입력받은것을 바로바로 출력하지 못하는 경우도 존재하는 등 여러 이유로 입력받은 이미지를 버퍼에 임시 저장한 후 출력한다. 시스템에 따라 버퍼를 하나만 사용하거나 둘, 셋 이상을 사용하는 방식도 있다. 여기서 버퍼를 둘 사용하는것이 더블버퍼링이며 버퍼를 하나만 사용할때의 단점을 보완할 수 있다.

플리커링(Flickering)과 티어링(Tearing)

버퍼를 하나만 사용하면 발생하는 문제점들이있는데, 플리커링과 티어링이 있다.

플리커링

우리가 보는 영상은 출력버퍼의 내용이다. 그런데 스틸이미지가 아니라 움직이는 영상이므로 출력버퍼의 내용이 계속 바뀌어야 한다. 따라서 출력버퍼는 기록->삭제->기록->삭제를 끊임없이 반복한다. 이때 사용자는 기록된 것을 볼 수도 있고 지워진 버퍼를 볼 수도 있다. 버퍼가 지워진 시간이 찰나라면 육안으로 인식이 안되겠지만 그렇지 않다면 영상 깜빡거림을 확인할 수 있다. 이를 플리커링이라고 한다.

플리커링이 없는 경우

플리커링이 있는 경우

티어링

카메라로부터 받아온 이미지는 버퍼에 저장되고 디스플레이는 이 버퍼의 내용을 출력해야한다. 그런데 디스플레이가 버퍼의 내용을 빠르게 출력하지 못하면 아직 버퍼의 내용을 다 출력하지 못했는데 버퍼의 내용이 바뀌는 상황이 생길 수 있다. 이것이 이미지가 찢어지는 티어링이다.

https://cdn.appuals.com/wp-content/uploads/2018/07/14.jpg

더블버퍼링

위의 플리커링과 티어링의 문제를 해결하기 위해 버퍼가 두개인 더블버퍼링 기법을 사용한다. 기존의 방식은 하나의 버퍼를 두고 그 버퍼에 이미지를 채우고 출력하고 출력이 완료되면 다시 이미지를 채우기를 반복하지만 더블버퍼링은 이미지를 채우는 버퍼(이하 백버퍼), 출력하는 버퍼(이하 프론트버퍼) 두개로 나눈다. 이미지센서가 백버퍼에 이미지를 쓰고 백버퍼의 이미지가 완전히 채워지면 프론트버퍼로 옮긴다. 이후 디스플레이는 프론트버퍼를 출력한다. 디스플레이는 프론트버퍼의 내용만 끊임없이 출력하고 있으며 백버퍼는 이미지가 완성되어야만 프론트버퍼로 전송하기 때문에 이미지의 일부만 출력되는 티어링은 나타나지 않는다. 또한 Swap Chain, Page Flipping 기법으로 백버퍼의 내용을 프론트버퍼로 카피하는것이 아닌 디스플레이가 참조하는 버퍼의 메모리 주소를 프론트버퍼에서 백버퍼로 변경하기 때문에 지우는 과정도 불필요하여 플리커링도 나타나지 않는다.

Swap Chain

https://mkblog.co.kr/gpus-swap-chain/

Page Flipping

https://flylib.com/books/3/67/1/html/2/graphic/06fig04.gif

참고

https://micropilot.tistory.com/1644

Leave a Comment