앱의 성능을 파악하고 병목 현상을 찾으려면 CPU 및 GPU 프레임 처리 시간 (프레임 시간)을 추정해야 합니다. AGI로 앱을 프로파일링하면 시스템 프로파일러에서 프레임 시간을 추정하는 데 사용할 수 있는 트레이스 데이터를 제공합니다.
CPU 시간
AGI에서는 시스템 프로필의 CPU 트랙에서 총 CPU 프레임 시간과 활성 CPU 프레임 시간을 볼 수 있습니다.
총 CPU 시간
소요된 총 CPU 시간을 측정하려면 연속적인 프레임 제출 이벤트 사이의 시간이 포함된 시간 범위를 선택합니다. 프레임 제출 이벤트는 eglSwapBuffers
(OpenGL의 경우) 및 vkQueuePresentKHR
(Vulkan의 경우)입니다.

eglSwapBuffer
이벤트
vkQueuePresentKHR
이벤트이 측정값은 총 CPU 시간의 추정치이지만 활성 CPU 시간을 반드시 나타내지는 않습니다. 예를 들어 GPU에 결합된 앱에서 CPU는 GPU가 작업을 완료할 때까지 기다린 후에 새 프레임을 제출할 수 있습니다. dequeueBuffer
, eglSwapBuffer
(OpenGL의 경우) 또는 vkQueuePresent
(Vulkan의 경우) 이벤트가 CPU 시간의 상당 부분을 차지하는 경우 흔히 발생합니다.
대기 시간은 총 CPU 시간에 포함되지만 활성 CPU 시간은 포함되지 않습니다.

dequeueBuffer
및 eglSwapBuffer
이벤트 중 대량의 유휴 상태.
활성 CPU 시간
활성 CPU 시간은 CPU가 유휴 상태에 있지 않고 앱 코드를 실행하는 시기를 결정합니다.
활성 CPU 시간을 측정하려면 CPU 이벤트 바로 위의 Running 슬라이스를 확인합니다. Running 상태에 있는 두 프레임 제출 이벤트 사이의 트레이스를 모두 셉니다. 작업 스레드를 포함해야 합니다.


활성 CPU 시간을 측정하는 또 다른 방법은 CPU 트랙에서 앱 슬라이스를 확인하는 것입니다. 이러한 슬라이스는 CPU가 실행 중일 때 표시되며 Running 슬라이스에 해당합니다.

앱 슬라이스를 식별하는 데 도움이 되도록 앱에 ATrace 마커를 추가하면 됩니다. 그러면 시스템 프로파일러의 CPU 트랙에 마커가 표시됩니다.

GPU 프레임 시간 예측
GPU 프레임 시간을 추정하려면 시스템 프로파일러에서 GPU 슬라이스 또는 GPU 카운터를 사용하면 됩니다. GPU 슬라이스를 사용하면 추정값이 더 정확합니다.
GPU 슬라이스
시스템 프로파일러에 GPU 슬라이스 정보가 있는 경우 앱이 단일 프레임과 관련된 작업을 처리하는 데 소요된 총 시간을 측정하여 매우 정확한 GPU 프레임 시간 정보를 얻을 수 있습니다.
말리 기기
말리 기기에서 GPU 슬라이스에는 프래그먼트, 비프래그먼트, 그리고 경우에 따라 보조 비프래그먼트 트랙이 있습니다. 덜 복잡한 프레임의 경우 프래그먼트와 프래그먼트가 아닌 작업은 순차적이므로 활성 GPU 작업 간의 간격을 확인하여 한 프레임의 작업을 다른 프레임과 구분할 수 있습니다.
또는 GPU에 제출하는 작업에 익숙하다면 제출된 렌더 패스의 패턴을 식별하면 프레임 시작 및 종료 시점에 대한 정보를 확인할 수 있습니다.


병렬 처리된 GPU 워크플로가 있는 앱의 경우 각 슬라이스의 Selection 창에서 동일한 submissionID를 가진 모든 프레임을 찾아 GPU 프레임 시간을 가져올 수 있습니다.
Vulkan 기반 앱의 경우 여러 제출물을 사용하여 프레임을 구성할 수 있습니다. 각 제출의 슬라이스가 포함된 Vulkan 이벤트 트랙을 사용하여 제출 ID를 추적합니다. 제출 슬라이스를 선택하면 제출에 해당하는 모든 GPU 활동 슬라이스가 강조표시됩니다.


Adreno 기기
Adreno 기기에서 GPU 슬라이스는 GPU Queue 0 트랙에 표시되며 항상 순차적으로 표시됩니다. 따라서 프레임의 렌더링 패스를 나타내는 모든 슬라이스를 살펴보고 이를 사용하여 GPU 프레임 시간을 측정할 수 있습니다.


앞서 설명한 말리 시나리오와 비슷합니다. 앱이 Vulkan을 사용하는 경우 Vulkan 이벤트 트랙은 프레임 실행을 위해 제출되는 작업에 관한 정보를 제공합니다. 렌더링 패스를 강조 표시하려면 프레임과 연결된 Vulkan 이벤트 슬라이스를 클릭합니다.

앱이 GPU에 크게 종속되어 GPU 프레임 경계를 구분하기가 더 어려운 시나리오가 있습니다. 이러한 시나리오에서 GPU에 제출되는 작업에 익숙하다면 렌더링 패스가 실행되는 패턴을 식별하고 해당 정보에서 프레임 경계를 결정할 수 있습니다.

GPU 카운터
트레이스에 GPU 슬라이스 정보를 사용할 수 없는 경우 GPU 카운터 트랙을 사용하여 GPU 프레임 시간을 추정할 수 있습니다.
말리 기기
말리 기기에서 GPU 사용률 트랙을 사용하여 GPU를 많이 사용하지 않는 앱의 GPU 프레임 시간을 추정할 수 있습니다. 앱의 GPU 집약도가 낮은 경우 지속적으로 높은 활동이 아닌 낮은 주기와 높은 GPU 활동이 발생합니다. GPU 사용률 트랙을 사용하여 GPU 프레임 시간을 추정하려면 트랙에서 활동이 많은 기간을 측정하세요.

앱이 GPU를 많이 사용하는 경우 프래그먼트 및 비프래그먼트 트랙을 사용하여 GPU 프레임 시간을 예측할 수 있습니다. 프래그먼트와 프래그먼트가 아닌 트랙의 활동 수준에서 패턴을 살펴보면 프레임의 경계 위치를 대략적으로 추정하고 이를 바탕으로 GPU 프레임 시간을 측정할 수 있습니다.

Adreno 기기
Adreno 기기에서 앱이 GPU를 많이 사용하지 않는 경우 이전 섹션에서 Mali 기기를 사용할 때와 동일한 방식으로 GPU 프레임 시간을 예측할 수 있습니다.

앱이 GPU를 많이 사용하는 경우 Vertex 안내/초 및 프래그먼트 안내 / 초 트랙을 사용하여 GPU 프레임 시간을 예측할 수 있습니다. 이러한 트랙의 활동 수준에서 패턴을 찾으면 프레임의 경계 위치를 대략적으로 추정하고 이를 사용하여 GPU 프레임 시간을 측정할 수 있습니다.

다음 트랙도 비슷한 정보를 제공할 수 있습니다.
- 꼭지점 음영 / 초
- 프래그먼트 음영 / 초
- 시간 음영 꼭짓점 비율
- 시간 프래그먼트 비율