앱의 성능을 파악하고 병목 현상을 찾으려면 CPU 및 GPU 프레임 처리 시간 (프레임 시간)을 추정해야 합니다. AGI로 앱을 프로파일링하면 시스템 프로파일러에서 프레임 시간을 추정하는 데 사용할 수 있는 트레이스 데이터를 제공합니다.
CPU 시간
AGI에서는 시스템 프로필의 CPU 트랙에서 총 CPU 프레임 시간과 활성 CPU 프레임 시간을 볼 수 있습니다.
총 CPU 시간
소요된 총 CPU 시간을 측정하려면 연속적인 프레임 제출 이벤트 사이의 시간이 포함된 시간 범위를 선택합니다. 프레임 제출 이벤트는 eglSwapBuffers
(OpenGL의 경우) 및 vkQueuePresentKHR
(Vulkan의 경우)입니다.
![여러 eglSwapBuffer 이벤트의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image1.png?authuser=0000&hl=ko)
eglSwapBuffer
이벤트![vkQueuePresentKHR 이벤트의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image2.png?authuser=0000&hl=ko)
vkQueuePresentKHR
이벤트이 측정값은 총 CPU 시간의 추정치이지만 활성 CPU 시간을 반드시 나타내지는 않습니다. 예를 들어 GPU에 결합된 앱에서 CPU는 GPU가 작업을 완료할 때까지 기다린 후에 새 프레임을 제출할 수 있습니다. dequeueBuffer
, eglSwapBuffer
(OpenGL의 경우) 또는 vkQueuePresent
(Vulkan의 경우) 이벤트가 CPU 시간의 상당 부분을 차지하는 경우 흔히 발생합니다.
대기 시간은 총 CPU 시간에 포함되지만 활성 CPU 시간은 포함되지 않습니다.
![dequeueBuffer 및 eglSwapBuffer 이벤트 중에 많은 양의 유휴 상태를 표시하는 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image3.png?authuser=0000&hl=ko)
dequeueBuffer
및 eglSwapBuffer
이벤트 중 대량의 유휴 상태.
활성 CPU 시간
활성 CPU 시간은 CPU가 유휴 상태에 있지 않고 앱 코드를 실행하는 시기를 결정합니다.
활성 CPU 시간을 측정하려면 CPU 이벤트 바로 위의 Running 슬라이스를 확인합니다. Running 상태에 있는 두 프레임 제출 이벤트 사이의 트레이스를 모두 셉니다. 작업 스레드를 포함해야 합니다.
![활성 CPU 시간을 측정하는 데 사용할 수 있는 두 가지 CPU 시간 기간의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image5.png?authuser=0000&hl=ko)
![기본 스레드가 유휴 상태인 동안 작업 스레드가 있는 멀티스레드 앱의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image6.png?authuser=0000&hl=ko)
활성 CPU 시간을 측정하는 또 다른 방법은 CPU 트랙에서 앱 슬라이스를 확인하는 것입니다. 이러한 슬라이스는 CPU가 실행 중일 때 표시되며 Running 슬라이스에 해당합니다.
![CPU 트랙과 일치하는 고정된 스레드의 실행 상태를 표시하는 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image7.png?authuser=0000&hl=ko)
앱 슬라이스를 식별하는 데 도움이 되도록 앱에 ATrace 마커를 추가하면 됩니다. 그러면 시스템 프로파일러의 CPU 트랙에 마커가 표시됩니다.
![CPU 트랙에 있는 ATrace 마커의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image8.png?authuser=0000&hl=ko)
GPU 프레임 시간 예측
GPU 프레임 시간을 추정하려면 시스템 프로파일러에서 GPU 슬라이스 또는 GPU 카운터를 사용하면 됩니다. GPU 슬라이스를 사용하면 추정값이 더 정확합니다.
GPU 슬라이스
시스템 프로파일러에 GPU 슬라이스 정보가 있는 경우 앱이 단일 프레임과 관련된 작업을 처리하는 데 소요된 총 시간을 측정하여 매우 정확한 GPU 프레임 시간 정보를 얻을 수 있습니다.
말리 기기
말리 기기에서 GPU 슬라이스에는 프래그먼트, 비프래그먼트, 그리고 경우에 따라 보조 비프래그먼트 트랙이 있습니다. 덜 복잡한 프레임의 경우 프래그먼트와 프래그먼트가 아닌 작업은 순차적이므로 활성 GPU 작업 간의 간격을 확인하여 한 프레임의 작업을 다른 프레임과 구분할 수 있습니다.
또는 GPU에 제출하는 작업에 익숙하다면 제출된 렌더 패스의 패턴을 식별하면 프레임 시작 및 종료 시점에 대한 정보를 확인할 수 있습니다.
![순서대로 실행되는 여러 프레임의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image9.png?authuser=0000&hl=ko)
![개별 프레임의 작업에 AGI를 확대한 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image10.png?authuser=0000&hl=ko)
병렬 처리된 GPU 워크플로가 있는 앱의 경우 각 슬라이스의 Selection 창에서 동일한 submissionID를 가진 모든 프레임을 찾아 GPU 프레임 시간을 가져올 수 있습니다.
Vulkan 기반 앱의 경우 여러 제출물을 사용하여 프레임을 구성할 수 있습니다. 각 제출의 슬라이스가 포함된 Vulkan 이벤트 트랙을 사용하여 제출 ID를 추적합니다. 제출 슬라이스를 선택하면 제출에 해당하는 모든 GPU 활동 슬라이스가 강조표시됩니다.
![한 프레임의 작업이 다른 프레임과 겹칠 수 있는 병렬화된 GPU 워크로드의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image11.png?authuser=0000&hl=ko)
![선택한 프레임과 관련된 여러 Vulkan 이벤트의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image12.png?authuser=0000&hl=ko)
Adreno 기기
Adreno 기기에서 GPU 슬라이스는 GPU Queue 0 트랙에 표시되며 항상 순차적으로 표시됩니다. 따라서 프레임의 렌더링 패스를 나타내는 모든 슬라이스를 살펴보고 이를 사용하여 GPU 프레임 시간을 측정할 수 있습니다.
![순서대로 실행되는 여러 프레임의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image13.png?authuser=0000&hl=ko)
![여러 렌더 패스가 있는 프레임에서 AGI를 확대한 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image14.png?authuser=0000&hl=ko)
앞서 설명한 말리 시나리오와 비슷합니다. 앱이 Vulkan을 사용하는 경우 Vulkan 이벤트 트랙은 프레임 실행을 위해 제출되는 작업에 관한 정보를 제공합니다. 렌더링 패스를 강조 표시하려면 프레임과 연결된 Vulkan 이벤트 슬라이스를 클릭합니다.
![선택한 프레임의 Vulkan 이벤트가 있는 Vulkan 기반 앱의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image15.png?authuser=0000&hl=ko)
앱이 GPU에 크게 종속되어 GPU 프레임 경계를 구분하기가 더 어려운 시나리오가 있습니다. 이러한 시나리오에서 GPU에 제출되는 작업에 익숙하다면 렌더링 패스가 실행되는 패턴을 식별하고 해당 정보에서 프레임 경계를 결정할 수 있습니다.
![프레임 경계를 식별하는 데 도움이 되는 렌더링 패스 패턴이 있고 GPU가 많이 바인딩된 앱의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image16.png?authuser=0000&hl=ko)
GPU 카운터
트레이스에 GPU 슬라이스 정보를 사용할 수 없는 경우 GPU 카운터 트랙을 사용하여 GPU 프레임 시간을 추정할 수 있습니다.
말리 기기
말리 기기에서 GPU 사용률 트랙을 사용하여 GPU를 많이 사용하지 않는 앱의 GPU 프레임 시간을 추정할 수 있습니다. 앱의 GPU 집약도가 낮은 경우 지속적으로 높은 활동이 아닌 낮은 주기와 높은 GPU 활동이 발생합니다. GPU 사용률 트랙을 사용하여 GPU 프레임 시간을 추정하려면 트랙에서 활동이 많은 기간을 측정하세요.
![Mali 기기의 GPU 사용률 및 GPU 큐 트랙을 보여주는 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image17.png?authuser=0000&hl=ko)
앱이 GPU를 많이 사용하는 경우 프래그먼트 및 비프래그먼트 트랙을 사용하여 GPU 프레임 시간을 예측할 수 있습니다. 프래그먼트와 프래그먼트가 아닌 트랙의 활동 수준에서 패턴을 살펴보면 프레임의 경계 위치를 대략적으로 추정하고 이를 바탕으로 GPU 프레임 시간을 측정할 수 있습니다.
![프래그먼트 및 프래그먼트가 아닌 트랙의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image18.png?authuser=0000&hl=ko)
Adreno 기기
Adreno 기기에서 앱이 GPU를 많이 사용하지 않는 경우 이전 섹션에서 Mali 기기를 사용할 때와 동일한 방식으로 GPU 프레임 시간을 예측할 수 있습니다.
![Adreno 기기의 GPU 사용률 및 GPU 큐 트랙 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image19.png?authuser=0000&hl=ko)
앱이 GPU를 많이 사용하는 경우 Vertex 안내/초 및 프래그먼트 안내 / 초 트랙을 사용하여 GPU 프레임 시간을 예측할 수 있습니다. 이러한 트랙의 활동 수준에서 패턴을 찾으면 프레임의 경계 위치를 대략적으로 추정하고 이를 사용하여 GPU 프레임 시간을 측정할 수 있습니다.
![Vertex 안내 / 두 번째 트랙의 스크린샷](https://developer.android.google.cn/static/images/agi/long-images/image20.png?authuser=0000&hl=ko)
다음 트랙도 비슷한 정보를 제공할 수 있습니다.
- 꼭지점 음영 / 초
- 프래그먼트 음영 / 초
- 시간 음영 꼭짓점 비율
- 시간 프래그먼트 비율