이 페이지에서는 오버드로의 정의, 진단 방법, 오버드로를 제거하거나 완화하는 방법을 설명합니다.
앱이 한 프레임 내에 같은 픽셀을 두 번 이상 그리는 경우 이를 오버드로라고 합니다. 일반적으로 오버드로는 불필요하므로 제거하는 것이 가장 좋습니다. 오버드로는 사용자가 화면에서 보는 것에 기여하지 않는 픽셀을 렌더링하기 위해 GPU 시간을 낭비할 때 성능 문제가 됩니다.
오버드로 소개
오버드로는 단일 프레임을 렌더링할 때 시스템이 화면에 한 픽셀을 여러 번 그리는 것을 의미합니다. 예를 들어 UI 카드가 여러 개 쌓여 있다면 위에 있는 각 카드는 아래에 있는 카드의 일부를 가립니다.
하지만 시스템은 스택에서 카드의 숨겨진 부분까지 그려야 합니다. 왜냐하면 쌓여있는 카드는 페인터의 알고리즘(즉, 뒤에서 앞으로 가는 순서)에 따라 렌더링되기 때문입니다. 이러한 렌더링 순서를 사용하면 시스템은 그림자와 같은 반투명 객체에 알파 블렌딩을 적절하게 적용할 수 있습니다.
오버드로 문제 찾기
플랫폼은 오버드로가 앱의 성능에 영향을 미치는지 결정하는 데 도움을 주기 위해 다음의 도구를 제공합니다.
GPU 오버드로 디버그 도구
GPU 오버드로 디버그 도구는 앱이 화면에서 각 픽셀을 그리는 횟수를 색상으로 구분하여 표시합니다. 이 값이 클수록 오버드로가 앱의 성능에 영향을 미칠 가능성이 큽니다.
자세한 내용은 GPU 오버드로 시각화를 참고하세요.
GPU 렌더링 프로파일링 도구
GPU 렌더링 프로파일링 도구는 렌더링 파이프라인의 각 단계에서 단일 프레임을 표시하는 데 걸리는 시간을 스크롤 히스토그램으로 표시합니다. 주황색으로 표시된 각 막대의 처리 부분은 시스템이 버퍼를 전환하는 시기를 보여줍니다. 이 측정항목은 오버드로에 관한 중요한 단서를 제공합니다.
성능이 낮은 GPU에서는 사용 가능한 채우기 속도(GPU가 프레임 버퍼를 채울 수 있는 속도)가 매우 낮을 수 있습니다. 프레임을 그리는 데 필요한 픽셀의 수가 늘어남에 따라 GPU에서 새로운 명령어를 처리하는 데 더 오래 걸리고, 시스템의 나머지 부분에 따라잡을 수 있을 때까지 기다리도록 요청할 수 있습니다. 처리 막대는 GPU가 픽셀을 최대한 빨리 그리면서 과부하가 발생해 이러한 급증이 발생함을 보여줍니다. 원시 픽셀 수 외의 문제로 인해 이 측정항목이 급증할 수도 있습니다. 예를 들어 GPU 오버드로 디버그 도구가 과도한 오버드로 및 처리 급증을 보이면 오버드로와 관련된 문제가 있을 수 있습니다.
자세한 내용은 GPU 렌더링 속도 프로파일링을 참고하세요.
오버드로 수정
다음과 같은 방법으로 오버드로를 줄이거나 없앨 수 있습니다.
- 레이아웃에서 불필요한 배경 삭제
- 뷰 계층 구조 평면화
- 투명도 줄이기
이 섹션에서는 위의 각 접근 방식에 관한 정보를 제공합니다.
레이아웃에서 불필요한 배경 삭제
기본적으로 레이아웃에는 배경이 없습니다. 즉, 레이아웃 자체는 어떤 것도 직접 렌더링하지 않습니다. 그러나 레이아웃에 배경이 있으면 오버드로가 발생할 수 있습니다.
불필요한 배경을 삭제하여 렌더링 성능을 개선할 수 있습니다. 불필요한 배경은 보이지 않을 수 있습니다. 앱이 그 위에 그리는 모든 항목으로 완전히 가리기 때문입니다. 예를 들어 시스템은 그 위에 하위 뷰를 그릴 때 상위 요소의 배경을 완전히 가릴 수 있습니다.
오버드로를 실행하고 있는 이유를 알아보려면 Layout Inspector 도구에서 계층 구조를 살펴보세요. 사용자에게 보이지 않는 배경을 찾아 제거할 수 있습니다. 공통 배경색을 공유하는 컨테이너가 많을 때 불필요한 배경을 제거할 수 있습니다. 창 배경을 앱의 기본 배경색으로 설정하고 그 위의 모든 컨테이너를 정의된 배경 값 없이 둘 수 있습니다.
뷰 계층 구조 평면화
최신 레이아웃을 사용하면 뷰를 쌓고 레이어를 구성하여 멋진 디자인을 만들 수 있습니다. 그러나 이렇게 하면 특히 쌓인 뷰 객체 각각이 불투명하여 화면에 보이는 픽셀과 보이지 않는 픽셀 모두 그려야 하는 시나리오에서 오버드로가 발생하여 성능이 저하될 수 있습니다.
이 문제가 발생하면 중복되는 뷰 계층 구조를 최적화하여 UI 객체의 수를 줄임으로써 성능을 개선할 수 있습니다. 이를 실행하는 방법에 관한 자세한 내용은 성능 및 뷰 계층 구조를 참고하세요.
투명도 줄이기
화면에 투명 픽셀을 렌더링하는 것(알파 렌더링이라고 함)은 오버드로의 주요 원인입니다. 시스템이 픽셀 위에 불투명한 픽셀을 그려서 기존에 그려진 픽셀을 완전히 가리는 표준 오버드로와 달리, 투명 객체는 기존 픽셀을 먼저 그려야 올바른 혼합 등식을 얻을 수 있습니다.
투명 애니메이션, 페이드 아웃, 그림자와 같은 시각 효과는 약간의 투명도를 포함하기 때문에 오버드로에 상당한 영향을 미칠 수 있습니다. 렌더링하는 투명 객체의 수를 줄이는 방법으로 이러한 상황에서 오버드로를 개선할 수 있습니다. 예를 들어 TextView
에 반투명 알파 값이 설정된 검은색 텍스트를 그려 회색 텍스트를 얻을 수 있습니다. 그러나 텍스트를 회색으로 그리면 같은 효과를 얻으면서 성능은 향상할 수 있습니다.
투명도가 전체 그리기 파이프라인에 부과하는 성능 비용에 관해 자세히 알아보려면 숨겨진 투명도 비용 동영상을 참고하세요.