Skip to content

Most visited

Recently visited

navigation

GPU 렌더링 속도 및 오버드로 검사

Android에는 앱이 UI를 렌더링할 때 문제(예: 필요한 것보다 많은 렌더링 작업 수행, 긴 스레드 및 GPU 작업 실행)가 발생할 수 있는 곳을 시각화하는 데 도움이 되는 몇 가지 온디바이스 개발자 옵션이 있습니다. 이 페이지에서는 GPU 오버드로를 디버그하고 GPU 렌더링을 프로파일링하는 방법을 설명합니다.

온디바이스 개발자 옵션을 활성화하는 방법을 비롯해 이러한 옵션에 대한 자세한 내용은 온디바이스 개발자 옵션 구성을 읽어보세요.

GPU 렌더링 속도 프로파일링

Profile GPU Rendering 도구는 프레임당 16ms라는 벤치마크를 기준으로 UI 창의 프레임 렌더링 소요 시간을 스크롤 방식의 히스토그램 형태로 시각적으로 표시합니다.

성능이 낮은 GPU에서는 지원되는 채우기 속도(GPU가 프레임 버퍼를 채울 수 있는 속도)가 꽤 낮을 수 있습니다. 프레임을 그리는 데 필요한 픽셀 수가 늘어남에 따라 GPU가 새로운 명령어를 처리하는 데 더 오래 걸리고, 시스템의 나머지 부분은 GPU가 따라갈 수 있을 때까지 대기하도록 요청할 수 있습니다. 프로파일링 도구는 GPU가 픽셀을 그리느라 성능이 저하되거나 과중한 오버드로의 부담을 안을 때 이를 식별하는 데 도움이 됩니다.

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

프로파일러 활성화

시작하기 전에 Android 4.1(API 레벨 16) 이상을 실행하는 기기를 사용 중인지, 그리고 개발자 옵션을 활성화했는지 확인하세요. 앱을 사용하는 동안 프로파일링 기기 GPU 렌더링을 시작하려면 다음과 같이 진행하세요.

  1. 기기에서 Settings로 이동하고 Developer Options를 탭합니다.
  2. Monitoring 섹션에서 Profile GPU Rendering을 선택합니다.
  3. 'Profile GPU Rendering' 대화상자에서 On screen as bars를 선택하여 기기 화면 위에 그래프를 오버레이합니다.
  4. 프로파일링하려는 앱을 엽니다.

출력 결과를 살펴봅니다.

그림 1에 표시된 'Profile GPU Rendering' 그래프의 확대 이미지에서 Android 6.0(API 레벨 23)에 표시되는 것처럼 색싱으로 구분된 섹션을 볼 수 있습니다.

그림 1. 확대된 Profile GPU Rendering 그래프.

다음은 출력 결과에 대해 주목해야 할 몇 가지 사항입니다.

다음 표에는 Android 6.0 이상을 실행하는 기기를 사용할 때 프로파일러 출력에 나타나는 세로 막대의 각 세그먼트에 대한 설명이 나와 있습니다.

막대의 구성 요소렌더링 단계설명
버퍼 스왑 GPU가 작업을 마칠 때까지 CPU가 대기하는 시간을 나타냅니다. 이 막대의 높이가 증가한다면 앱이 GPU에서 너무 많은 작업을 수행 중이라는 의미입니다.
명령어 문제 Android의 2D 렌더러가 표시 목록을 그리도록/다시 그리도록 OpenGL에게 명령을 내리는 데 소비한 시간을 나타냅니다. 이 막대의 높이는 각 표시 목록을 실행하는 데 걸리는 시간의 합계에 직접적으로 비례하며, 표시 목록 수가 많을수록 빨간색 막대가 더 길어집니다.
동기화 및 업로드 GPU로 비트맵 정보를 업로드하는 데 걸리는 시간을 나타냅니다. 큰 세그먼트는 앱이 대량의 그래픽을 로드하는 데 상당한 시간이 걸리고 있음을 나타냅니다.
그리기 뷰의 표시 목록을 생성하고 업데이트하는 데 사용되는 시간을 나타냅니다. 막대에서 이 부분이 높은 경우 사용자설정 뷰 그리기가 많거나 onDraw 메서드에 작업이 많을 수 있습니다.
측정/레이아웃 뷰 계층 구조에서 onLayoutonMeasure 콜백에 쓰이는 시간의 양을 나타냅니다. 큰 세그먼트는 뷰 계층 구조가 처리하는 데 오래 걸리고 있음을 나타냅니다.
애니메이션 해당 프레임을 실행 중이던 모든 애니메이터를 평가하는 데 걸린 시간을 나타냅니다. 이 세그먼트가 큰 경우 앱이 성능이 좋지 않은 사용자설정 애니메이터를 사용 중이거나 속성이 업데이트된 결과로 의도하지 않은 작업이 진행 중일 수 있습니다.
입력 처리 앱이 입력 이벤트 콜백의 내부에서 코드를 실행하는 데 소비한 시간을 나타냅니다. 이 세그먼트가 크다면 앱이 사용자 입력 처리에 너무 많은 시간을 쓰고 있다는 의미입니다. 이와 같은 처리를 다른 스레드로 오프로드하는 방안을 생각해보세요.
기타 시간/VSync 지연 앱이 연속되는 두 프레임 사이에서 작업을 실행하는 데 소비하는 시간을 나타냅니다. 이는 다른 스레드로 오프로드할 수 있는 UI 스레드에서 너무 많은 처리가 진행되고 있음을 나타내는 지표일 수 있습니다.

표 1. Android 6.0 이상의 구성 요소 막대.

4.0(API 레벨 14)과 5.0(API 레벨 21) 사이의 Android 버전에는 파란색, 보라색, 빨간색 및 주황색 세그먼트가 있습니다. 4.0 미만의 Android 버전에는 파란색, 빨간색 및 주황색 구성 요소만 있습니다. 다음 표는 Android 4.0과 5.0의 구성 요소 막대를 보여줍니다.

막대의 구성 요소렌더링 단계설명
프로세스 GPU가 작업을 마칠 때까지 CPU가 대기하는 시간을 나타냅니다. 이 막대의 높이가 증가한다면 앱이 GPU에서 너무 많은 작업을 수행 중이라는 의미입니다.
실행 Android의 2D 렌더러가 표시 목록을 그리도록/다시 그리도록 OpenGL에게 명령을 내리는 데 소비한 시간을 나타냅니다. 이 막대의 높이는 각 표시 목록을 실행하는 데 걸리는 시간의 합계에 직접적으로 비례하며, 표시 목록 수가 많을수록 빨간색 막대가 더 길어집니다.
XFer GPU로 비트맵 정보를 업로드하는 데 걸리는 시간을 나타냅니다. 큰 세그먼트는 앱이 대량의 그래픽을 로드하는 데 상당한 시간이 걸리고 있음을 나타냅니다. Android 4.0 이하를 실행 중인 기기에서는 이 세그먼트가 보이지 않습니다.
업데이트 뷰의 표시 목록을 생성하고 업데이트하는 데 사용되는 시간을 나타냅니다. 막대에서 이 부분이 높은 경우 사용자설정 뷰 그리기가 많거나 onDraw 메서드에 작업이 많을 수 있습니다.

표 2. Android 4.0 및 5.0의 구성 요소 막대.

프로파일링 도구에서 제공되는 정보의 해석 방법에 대한 자세한 내용은 Profile GPU Rendering으로 분석을 읽어보세요.

참고: 이 도구의 이름은 Profile GPU Rendering이지만 모든 모니터링되는 프로세스는 실제로는 CPU에서 발생합니다. GPU로 명령어를 제출하면 렌더링이 발생하고 GPU가 화면을 비동기식으로 렌더링합니다. 어떤 상황에서는 GPU가 처리해야 할 작업이 너무 많을 수 있으므로 CPU는 이런 작업 처리가 끝나기를 기다린 후에 새 명령어를 제출할 수 있습니다. 이런 상황이 발생할 때는 주황색 막대와 빨간색 막대의 높이가 치솟는 것이 보일 것이며, GPU 명령어 큐에 공간이 더 많이 확보될 때까지 명령어 제출이 차단됩니다.

GPU 오버드로 시각화

개발자 옵션의 또 다른 기능은 UI의 색을 지정함으로써 오버드로를 식별하는 데 도움이 됩니다. 앱이 같은 프레임 내에서 두 번 이상 같은 픽셀을 그릴 때 오버드로가 발생합니다. 따라서 이 시각화를 통해 앱이 필요한 것보다 많은 렌더링 작업을 수행 중인 곳을 알 수 있습니다. 이는 사용자에게는 보이지 않는 픽셀을 렌더링하느라 GPU가 추가로 사용되기 때문에 발생하는 성능 문제일 수 있습니다. 가급적이면 오버드로 이벤트를 해결해야 합니다.

아직 개발자 옵션을 활성화하지 않았다면 개발자 옵션을 활성화하세요. 그런 다음, 기기에서 오버드로를 시각화하려면 다음과 같이 진행하세요.

  1. 기기에서 Settings로 이동하고 Developer Options를 탭합니다.
  2. 아래로 스크롤하여 Hardware accelerated rendering 섹션으로 이동하고 Debug GPU Overdraw를 선택합니다.
  3. Debug GPU overdraw 대화상자에서 Show overdraw areas를 선택합니다.

Android에서는 오버드로의 양을 식별하기 위해 UI 요소의 색상을 다음과 같이 표시합니다.

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

그림 2. 정상적인 상태에서 앱의 모습(왼쪽)과 GPU 오버드로가 활성화된 상태에서 앱의 모습(오른쪽)

이런 색은 반투명하므로 화면에 실제로 나타나는 정확한 색은 UI의 콘텐츠에 따라 다릅니다.

레이아웃에서 오버드로가 나타나는 곳을 알 수 있으므로 오버드로를 줄이는 방법을 읽어보시면 도움이 됩니다.

피할 수 없는 오버드로도 있다는 점을 기억하시기 바랍니다. 앱의 사용자 인터페이스를 미세 조정하면서 거의 실제 색을 보여주거나 1X 오버드로(파란색)만 표시하는 시각화 수준에 이르도록 해보세요.

그림 3. 오버드로가 많은 앱(왼쪽)과 오버드로가 훨씬 적은 앱(오른쪽)의 예

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

WeChat에서 Google Developers 팔로우하기

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)