6월 3일의 ⁠#Android11: 베타 버전 출시 행사에 참여하세요.

오버드로 줄이기

앱은 한 프레임 내에 동일한 픽셀을 두 번 이상 그릴 수 있으며 이러한 작업을 오버드로 이벤트라고 합니다. 일반적으로 오버드로는 불필요하며 제거하는 것이 가장 좋습니다. 오버드로는 사용자가 화면에서 보는 것과 상관없는 픽셀을 렌더링하기 위해 GPU 시간을 낭비하여 성능 문제로 나타납니다.

이 문서에서는 오버드로의 정의, 진단 방법 및 오버드로를 제거하거나 완화하기 위해 취해야 하는 작업을 설명합니다.

오버드로 소개

오버드로는 렌더링의 단일 프레임에서 시스템이 화면에 한 픽셀을 여러 번 그리는 것을 의미합니다. 예를 들어 UI 카드가 여러 개 쌓여 있다면 위에 있는 각 카드는 아래에 있는 카드의 일부를 가립니다.

하지만 시스템은 스택에서 카드의 숨겨진 부분까지도 그려야 합니다. 왜냐하면 쌓여있는 카드는 페인터의 알고리즘(즉, 뒤에서 앞으로 가는 순서)에 따라 렌더링되기 때문입니다. 이러한 렌더링 순서를 사용하면 시스템은 그림자와 같은 반투명 개체에 알파 블렌딩을 적절하게 적용할 수 있습니다.

참고: 오버드로는 더 이상 Google I/O 성능 세션 및 성능 패턴 동영상에서 논의됐던 것만큼 중요한 문제가 아닙니다. 왜냐하면 저사양 기기는 GPU 성능 면에서 꾸준히 성장했지만, 화면은 상대적으로 낮은 해상도를 유지해왔기 때문입니다. 만약, 성능이 낮다고 알려진 GPU 기기를 최적화하는 것이 아니라면 겉으로만 앱 성능을 보장하는 대신 UI 스레드 작업을 최적화하는 것에 중점을 둘 것을 추천합니다. 이 외에, OS 최적화는 많은 경우 앱에서 오버드로를 방지합니다(예: 창 배경을 오버드로하는 프래그먼트 배경).

오버드로 문제 찾기

플랫폼은 오버드로가 앱의 성능에 영향을 미치는지 결정하는 데 도움을 주기 위해 다음의 도구를 제공합니다.

GPU 오버드로 디버그 도구

GPU 오버드로 디버그 도구는 앱이 화면에서 각 픽셀을 그리는 횟수를 색상으로 구분하여 표시합니다. 이 값이 클수록 오버드로가 앱의 성능에 영향을 미칠 가능성이 큽니다.

자세한 내용은 GPU 오버드로를 시각화하는 방법을 참조하세요.

프로필 GPU 렌더링 도구

프로필 GPU 렌더링 도구는 렌더링 파이프라인의 각 단계에서 단일 프레임을 표시하는 데 걸리는 시간을 스크롤할 수 있는 히스토그램으로 표시합니다. 주황색으로 표시된 각 막대의 처리 부분은 시스템이 버퍼를 전환하는 시기를 보여주며 이 측정항목은 오버드로에 관한 중요한 단서를 제공합니다.

성능 기준이 낮은 GPU에서는 사용 가능한 채우기 속도(GPU가 프레임 버퍼를 채울 수 있는 속도)가 매우 낮을 수 있습니다. 프레임을 그리는 데 필요한 픽셀의 수가 증가할수록 GPU에서 새로운 명령어를 처리하는 데 걸리는 시간이 더 길어지고, GPU는 따라잡을 수 있을 때까지 기다리도록 시스템의 나머지 부분에 요청할 수 있습니다. 처리 막대는 GPU가 픽셀을 최대한 빨리 그리도록 하는 시도에 압도되어 이러한 급증이 발생함을 보여줍니다. 원시 픽셀 수 외의 문제로 인해 이 측정항목이 급증할 수도 있습니다. 예를 들어 GPU 오버드로 디버그 도구가 과도한 오버드로 및 처리 급증을 보이면 오버드로와 관련된 문제가 있을 수 있습니다.

자세한 내용은 GPU 렌더링 속도를 프로파일링하는 방법을 참조하세요.

참고: 프로필 GPU 렌더링 도구는 NDK를 사용하는 앱에서는 작동하지 않습니다. 왜냐하면, OpenGL이 전체 화면 컨텍스트를 사용할 때마다 시스템은 백그라운드로 프레임워크 메시지를 푸시하기 때문입니다. 이러한 경우 GPU 제조업체에서 제공하는 프로파일링 도구가 도움이 될 수 있습니다.

오버드로 수정

오버드로를 제거하거나 줄이기 위해 실행할 수 있는 몇 가지 전략은 다음과 같습니다.

  • 레이아웃에서 불필요한 배경 삭제
  • 뷰 계층 구조의 평면화
  • 투명도 감소

이 섹션에서는 위의 각 접근 방식에 관한 정보를 제공합니다.

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

기본적으로 레이아웃에는 배경이 없으며 레이아웃 자체는 직접 렌더링하는 것이 없다는 것을 의미합니다. 그러나, 레이아웃에 배경이 있다면 오버드로가 발생할 수 있습니다.

불필요한 배경을 제거하는 것은 렌더링 성능을 향상하는 빠른 방법입니다. 앱이 뷰 위에 그리는 모든 것은 완벽하게 배경을 가리기 때문에 불필요한 배경은 절대 보이지 않을 수도 있습니다. 예를 들어, 상위 뷰 위에 하위 뷰를 그릴 때 시스템은 부모의 배경을 완전히 가릴 수 있습니다.

오버드로를 실행하고 있는 이유를 알아보려면 레이아웃 검사기 도구에서 계층 구조를 살펴보세요. 이렇게 하여 사용자에게 보이지 않기 때문에 제거할 수 있는 모든 배경을 찾을 수 있습니다. 많은 컨테이너가 공통 배경색을 공유하는 경우는 다음과 같이 불필요한 배경을 제거할 수 있는 또 다른 기회를 제공합니다. 창 배경을 앱의 기본 배경색으로 설정할 수 있고 배경 위의 모든 컨테이너를 정의된 배경 값 없이 둘 수 있습니다.

뷰 계층 구조의 평면화

최신 레이아웃을 사용하면 쉽게 뷰를 쌓고 레이어를 구성하여 멋진 디자인을 만들 수 있습니다. 그러나 이렇게 하면 특히 쌓인 뷰 개체 각각이 불투명하여 화면에 보이거나 보이지 않는 픽셀 모두 그려야 하는 시나리오에서 오버드로가 발생하여 성능이 저하될 수 있습니다.

이러한 문제가 발생하면 중복되는 UI 개체의 수를 줄이기 위해 뷰 계층 구조를 최적화하여 성능을 향상할 수 있습니다. 이를 실행하는 방법에 관한 자세한 내용은 뷰 계층 구조 최적화를 참조하세요.

투명도 줄이기

화면에 투명 픽셀을 렌더링하는 것(알파 렌더링이라고 함)은 오버드로의 주요 원인입니다. 시스템이 픽셀 위에 불투명한 픽셀을 그려서 기존에 그려진 픽셀을 완전히 가리는 표준 오버드로와 달리 투명 개체는 기존 픽셀을 먼저 그려야 올바른 혼합 등식을 얻을 수 있습니다. 투명 애니메이션, 페이드 아웃 및 그림자 같은 시각 효과는 모두 어느 정도 투명도를 포함하기 때문에 오버드로 발생에 상당한 영향을 미칠 수 있습니다. 렌더링하는 투명 개체의 수를 줄이는 방법으로 이러한 상황에서 오버드로를 개선할 수 있습니다. 예를 들어, TextView에 반투명 알파 값이 설정된 검은색 텍스트를 그려 회색 텍스트를 얻을 수 있습니다. 하지만, 단순히 텍스트를 회색으로 그리면 같은 효과를 얻으면서 성능은 훨씬 좋아질 수 있습니다.

투명도가 전체 그리기 파이프라인에 부과하는 성능 비용에 관해 자세히 알아보려면 숨겨진 투명도 비용을 참조하세요.