Android에는 앱에서 필요 이상으로 많은 렌더링 작업을 실행하거나 긴 스레드 및 GPU 작업을 실행하는 등 UI를 렌더링하는 데 문제가 발생할 수 있는 위치를 시각화하는 데 도움이 되는 온디바이스 개발자 옵션이 있습니다. 이 페이지에서는 GPU 오버드로를 디버깅하고 GPU 렌더링을 프로파일링하는 방법을 설명합니다.
사용 설정하는 방법을 포함하여 온디바이스 개발자 옵션을 자세히 알아보려면 온디바이스 개발자 옵션 구성을 읽어보세요.
GPU 렌더링 속도 프로파일링
GPU 렌더링 프로파일링 도구는 프레임당 16.67밀리초의 벤치마크를 기준으로 UI 창의 프레임을 렌더링하는 데 걸리는 시간을 스크롤 방식의 히스토그램으로 시각적으로 표시합니다.
성능이 낮은 GPU에서는 사용 가능한 채우기 속도 (GPU가 프레임 버퍼를 채울 수 있는 속도)가 매우 낮을 수 있습니다. 프레임을 그리는 데 필요한 픽셀의 수가 늘어남에 따라 GPU에서 새로운 명령어를 처리하는 데 더 오래 걸리고, GPU가 따라잡을 수 있을 때까지 시스템의 나머지 부분이 기다리게 될 수 있습니다.
프로파일링 도구를 사용하면 GPU가 픽셀을 그리느라 성능이 저하되거나 오버드로가 심한 경우를 파악할 수 있습니다.
프로파일러 사용 설정
시작하기 전에 Android 4.1 (API 수준 16) 이상을 실행하는 기기를 사용하고 개발자 옵션을 사용 설정해야 합니다. 앱을 사용하는 중에 기기 GPU 렌더링 프로파일링을 시작하려면 다음 단계를 따르세요.
- 기기에서 설정으로 이동하여 개발자 옵션을 탭합니다.
- 모니터링 섹션에서 기기에서 실행 중인 Android 버전에 따라 GPU 렌더링 프로파일 또는 HWUI 렌더링 프로파일을 선택합니다.
- 'GPU 렌더링 프로파일' 대화상자에서 화면에 막대로 표시를 선택하여 기기의 화면에 그래프를 오버레이합니다.
- 프로파일링하려는 앱을 엽니다.
출력 검사
그림 1의 확대된 GPU 렌더링 프로파일링 그래프 이미지에는 Android 6.0(API 수준 23)에 표시된 대로 색상 섹션이 표시됩니다.
그림 1. 확대된 GPU 렌더링 프로파일링 그래프
다음은 출력과 관련하여 주의할 사항입니다.
- 표시되는 각 애플리케이션에 관해 그래프가 표시됩니다.
- 가로축의 각 세로 막대는 프레임을 나타내며 각 세로 막대의 높이는 프레임을 렌더링하는 데 걸린 시간(밀리초)을 나타냅니다.
- 녹색 가로선은 16.67밀리초를 나타냅니다. 초당 60프레임을 달성하려면 각 프레임의 세로 막대가 이 선 아래에 머물러야 합니다. 막대가 이 선을 넘어서면 애니메이션이 일시중지될 수 있습니다.
- 16.67밀리초 임계값을 초과하는 프레임은 막대를 더 넓고 덜 투명하게 만들어 강조표시됩니다.
- 각 막대에는 렌더링 파이프라인의 단계로 매핑되는 색상이 지정된 구성요소가 있습니다. 구성요소의 수는 기기의 API 수준에 따라 다릅니다.
다음 표에서는 Android 6.0 및 이후 버전을 실행하는 기기를 사용하는 경우 프로파일러 출력에 포함되는 세로 막대의 각 세그먼트를 설명합니다.
| 막대의 구성요소 | 렌더링 단계 | 설명 |
|---|---|---|
| 버퍼 전환 | GPU가 작업을 마칠 때까지 CPU가 대기하는 시간을 나타냅니다. 이 막대가 높아지면 앱이 GPU에서 너무 많은 작업을 하고 있다는 것을 의미합니다. | |
| 명령어 사용 | Android의 2D 렌더기가 표시 목록을 그리거나 다시 그리기 위해 OpenGL에 명령을 내리는 데 소요되는 시간을 나타냅니다. 이 막대의 높이는 각 표시 목록을 실행하는 데 걸리는 시간의 합계에 정비례합니다. 표시 목록이 많을수록 빨간색 막대가 더 깁니다. | |
| 동기화 및 업로드 | 비트맵 정보를 GPU에 업로드하는 데 걸리는 시간을 나타냅니다. 큰 세그먼트는 앱에서 많은 양의 그래픽을 로드하는 데 상당한 시간이 걸린다는 것을 나타냅니다. | |
| 그리기 |
drawLine과 같은 그리기 명령어를 기록하는 데 사용된 시간을 나타냅니다. Compose에서 이 단계에는 측정 및 레이아웃 작업이 포함될 수 있습니다. 이 막대가 높으면 시스템 트레이스를 캡처하고 Perfetto를 사용하여 자세한 분석을 확인하세요.
|
|
| 측정/레이아웃 | 측정 및 배치 수정자 실행을 포함하는 레이아웃 단계에서 UI 구성요소의 위치를 지정하고 크기를 결정하는 데 소요된 시간을 나타냅니다. 큰 세그먼트는 이러한 수정자 내의 복잡한 계산이나 재계산이 자주 필요한 지나치게 깊은 레이아웃 트리를 나타냅니다. | |
| 입력 처리 및 애니메이션 |
애니메이션 API 호출을 평가하거나 포인터 입력을 처리하고 콜백하는 데 걸린 시간을 나타냅니다. 이 세그먼트가 크면 맞춤 애니메이션 또는 입력 콜백이 처리 시간을 너무 많이 사용하고 있음을 나타낼 수 있습니다. LazyColumn 또는 LazyRow을 스크롤하는 동안의 상태 계산 및 데이터 매핑도 일반적으로 이 세그먼트 중에 발생하고 이 세그먼트의 보다 일반적인 속도 저하 원인입니다.
|
|
| 기타 시간/VSync 지연 | 앱이 연속되는 두 프레임 사이에서 작업을 실행하는 데 소요되는 시간을 나타냅니다. 이는 UI 스레드에서 다른 스레드로 넘길 수 있는 너무 많은 작업을 처리 중임을 나타낼 수도 있습니다. |
표 1. Android 6.0 및 이후 버전의 구성요소 막대
프로파일링 도구에서 제공되는 정보를 해석하는 방법에 관한 자세한 내용은 GPU 렌더링 프로파일링으로 분석을 참고하세요.