오버드로(Overdraw) 란?

오버드로 안드로이드에서 오버드로 란 단일 프레임에 동일한 픽셀을 두 번이상 그리는 작업을 의미합니다.
안드로이드에서의 레이아웃은 페인터의 알고리즘 으로 그려지기에 사용자에게 보여지지 않는 부분까지 그려집니다. 이러한 이유로 인해 오버드로가 발생하면 GPU 렌더링 시간을 낭비하여 성능 문제로 이어질 수 있습니다.


어떻게 오버드로를 확인할까?

오버드로 디버그 도구 활성화

  1. 기기 설정에서 개발자 옵션을 클릭 합니다.
  2. 하드웨어 가속 렌더링 섹션에서 GPU 오버드로 디버그를 선택합니다.
  3. GPU 오버드로 디버그 팝업에서 오버드로 영역 표시를 선택합니다.

오버드로디버그

색 영역에 따른 오버드로 횟수

최적화하기전

위 이미지는 새로 출시 예정인 sellmagePos 앱의 가입고 화면입니다. 오버드로 디버그 도구를 정상적으로 활성화 하셨다면 위와 같이 모바일 화면이 여러 색 영역으로 구분되는것을 확인 할 수 있습니다. 이러한 색 영역은 오버드로 횟수에 따라 나누어지고 색상에 따른 오버드로 횟수는 아래와 같습니다.

  • 트루컬러 : 오버드로 없음
  • 파란색 : 오버드로 1회
  • 녹색 : 오버드로 2회
  • 분홍색 : 오버드로 3회
  • 빨간색 : 오버드로 4회 이상

오버드로 줄이기! (with 렌더링 최적화)

오버드로를 줄이거나 GPU 렌더링 최적화를 위한 방법으로는 크게 3가지가 있습니다

레이아웃에서 불필요한 배경 삭제

저는 계층 구조를 가진 레이아웃을 작성할때 같은 Background 속성을 가졌음에도 불구하고 무의식적으로 계층마다 같은 Background 속성값을 작성하는 경향이 있었습니다. 이러한 행위는 오버드로를 발생시킵니다.
안드로이드에서 제공하는 Layout Inspector 를 활용하면 레이아웃의 계층 구조를 파악하여 중복 되거나 사용자에게 보이지 않는 Background 를 제거 하여 불필요한 Background 속정을 제거 할 수 있습니다.

뷰 계층 구조의 평면화

의미없는 또는 중첩되는 Layout 감싸기를 줄여 레이아웃의 수직적 계층구조가 아닌 수평적 계층구조로 작성한다면 GPU 렌더링 성능을 최적화 할 수 있습니다.
계층구조 최적화의 자세한 방법은 안드로이드 공식 문서의 성능 및 뷰 계층 구조 에서 확인 가능합니다.

투명도 감소

레이아웃작성시 투명도와 관련된 속성은 사용자에게는 투명하지만 내부적으로는 투명 픽셀을 렌더링 합니다. 이러한 렌터링을 알파 렌더링 이라고 하고 이러한 알파 렌더링은 오버드로의 주요 원인 입니다.
투명 애니메이션, 페이드 아웃, 그림자 효과는 모두 어느 정도의 투명도를 포함하기 때문에 오버드로 발생에 영향을 미칠 수 있습니다. 이러한 상황에서는 투명 객체 수를 줄이는 방법으로 오버드로를 개선 할 수 있습니다.


그래서 개선 결과는??

최적화하기전 최적화한후

시범적으로 이번에 새로 출시 예정인 sellmatePos 앱에서 GPU 렌더링 최적화를 진행해 보았습니다.
위 사진에서 알 수 있듯이 대부분의 레이아웃에서 빨간색 색영역 즉 4회의상의 오버드로를 확인 할 수 있었습니다.
하지만 최적화 후에는 대부분의 레이아웃이 트루컬러로 나타나는것을 확인 할 수 있었습니다.