Android에서는 SurfaceView클래스를 사용하여 Double Buffering 을 지원하는데, Single Buffering과 Double Buffering 의 차이점과 장단점에 대해서 알아본다.
결론적으로,Single Buffering을 사용할 때 겪게 되는 처리지연, 깜박거림(flickering), 찢어짐(tearing) 현상을 피하기 위한 것이 Double Buffering방법이다.
Single Buffering
컴퓨터 모니터에 그래픽을 출력할 때, 메모리에 저장된 그래픽 데이터는 그대로 모니터에 표현된다.
즉, 모니터와 연결된 메모리에 임의의 내용이 기록되거나 지워지는 모든 반응이 그대로 모니터에 나타난다는 것이다. 일반적으로 모니터는 1초에 60번 정도의 주기로 연결된 메모리의 내용을 모니터에 나타내고 있다.
프로그램을 이용하여 비디오 메모리에 큰 이미지를 그린다면, 메모리에 이미지가 모두 그려지기도 전이라도 1초에 60번 주기로 메모리를 참조하여 모니터에 출력하는 기능은 계속될 것이고, 그 결과 이미지의 일부분 만이 모니터에 나타날 경우도 있을 것이다. 또한 기존 이미지 위에 새로운 이미지를 그리는 작업은 비디오 메모리에서 기존 그래픽 데이터를 모두 지운 다음 새로운 이미지를 그려야 하는데, 메모리를 지우는 과정에서도 모니터는 1초에 60번정도로 메모리를 참조하여 비디오 메모리의 내용을 모니터에 나타내는 작업은 계속되므로 이미지가 부분적으로 지워지는 과정까지도 모니터에 나타나게 될 가능성이 있는 것이다.
flickering : 이미지를 지울 때 순간적으로 빈 화면이 나타났다가 이후로 이미지가 나타나므로 깜박거림현상으로 인식된다.
tearing: 이미지가 그려지는 과정과 지워지는 과정에서 일부분의 이미지가 화면에 보여지므로 이미지가 찢어지는 현상으로 인식된다.
Single Buffering의 문제점
Single Buffering 방법으로 비디오 데이터를 모니터에 출력하는 작업은 위에서와 같은 문제점 때문에 이미지의 일부분만 출력되는 tearing현상과 메모리를 지우는 과정이 그대로 모니터에 타나는 flickering 현상을 피하기가 어렵게 된다.
Single Buffering의 해결책
비디오 메모리에 이미지가 온전히 완성된 상태만 모니터에 나타나도록 하면 된다. 즉, 비디오 메모리를 지우는 과정과 그림을 그리는 과정은 모니터에 출력되지 않도록 하면 될 것이다. 이를 해결하기 위해서 비디오 메모리에 쓰는 작업과 지우는 작업 중일때는 모니터가 이 메모리를 참조하지 않도록 하면 될 것 같지만, 시스템이 비디오 메모리에 쓰기 작업을 하는 동안에는 쓰기 작업이 완료될 때까지 모니터가 기다려야 하고, 모니터측에서 비디오 메모리를 참조하고 있는 동안에는 시스템이 메모리에 쓰기 작업을 할 수 없어서 기다려야 하므로 처리의 지연을 피할 수가 없다. 그러므로 추가적으로 메모리를 할애하여 쓰기와 읽기, 지우기 작업이 지연되지 않도록 하면 될 것이다.
Double Buffering 방법
Single Buffering 의 문제점은 한개의 비디오 메모리에 이미지를 기록하고 읽고 지우는 작업이 동시에 실행되기 때문에 발생하는 문제이므로, 비디오 메모리를 2개소로 늘려서 쓰기, 읽기, 지우기 작업이 서로 간섭하지 않도록 하면 해결될 수 있으며 이런 방법을 Double Buffering이라고 한다.
시스템이 비디오 메모리 A에 지우기, 쓰기 작업을 하는 동안 모니터는 완성된 이미지가 존재하는 비디오 메모리 B를 참조하여 모니터에 출력하고, 메모리 A의 쓰기작업이 완료되면, 시스템은 지체없이 메모리 B로 이동하여 지우기 쓰기 작업을 계속 수행한다. 또한 메모리 A에 온전한 그래픽 데이터가 존재하므로 모니터는 메모리A를 참조하여 모니터에 출력하므로 서로의 작업이 완료될 때까지 대기해야 하는 지연을 피할 수가 있고, 깜박거림, 찢어짐현상을 막을 수가 있다. Double Buffering 방법에서 모니터에 연결되는 비디오 메모리 영역이 번갈아 가면서 변경되는데,이를 Page Flipping이라고 하며, 더블버퍼링에 사용되는 메모리 영역을 surface 라고 하고 surface에는 Back Buffer와 Front Buffer가 있다.
Back Buffer : 시스템이 그래픽 데이터를 메모리에 그리는 영역
Front Buffer : 모니터에 의해서 참조되어 화면에 출력되는 메모리 영역
Double Buffering의 단점
Doublke Buffering은 메모리를 2개소(Back Buffer, Front Buffer) 이상 사용하여 그래픽 데이터를 저장해야 하므로 추가적인 메모리가 필요하며, 작업 지연을 피할 수가 있는 대신에 CPU시간을 추가적으로 요구하게 된다.
Android/Double Buffering