이 가이드에서는 원활한 사용자 환경을 위해 Android 기기에서 게임 성능을 분석하고 최적화하는 과정을 설명합니다. 여기에서는 성능 병목 현상 식별, CPU 문제와 GPU 문제 구분, 최적화 결과 확인을 다룹니다.
게임이 아무리 재미있고 매력적이라도 모바일 기기에서 제대로 실행되지 않으면 플레이어가 즐길 수 없고 성공할 수 없습니다. 재미있는 게임도 초당 프레임 수 (FPS)가 낮거나 기기가 너무 뜨거워지는 등의 문제가 발생할 수 있습니다. 이러한 문제로 인해 플레이어가 불만을 느낍니다. 따라서 게임 성능을 개선하는 것이 중요하며 최적화 방법을 이해해야 합니다.
성능 최적화 프로세스에는 다음 단계가 포함됩니다.
전반적인 게임 성능을 측정합니다. 장면별로 성능 저하를 수치화하여 이상치를 정확히 파악합니다.
CPU 및 GPU 바운드 확인 CPU 바운드인지 GPU 바운드인지 근본 원인을 파악합니다.
도구: Unreal Insight, Unity Profiler, Perfetto, 성능 측정 도구
CPU 최적화. 식별된 성능 병목 현상을 수정합니다.
도구: Unreal Insight, Unity Profiler, Perfetto, Simpleperf
GPU 최적화 식별된 성능 병목 현상을 수정합니다.
도구: RenderDoc, Arm 모바일 스튜디오, AGI, 공급업체별 도구
A/B 테스트 A/B 테스트를 실시하여 구현된 최적화의 효과를 엄격하게 검증합니다.
도구: Unreal Insight, Unity Profiler, Perfetto, 성능 측정 도구, CPU 또는 GPU 주파수 잠금, RenderDoc
이 반복 프로세스 (1~5)는 타겟 FPS와 열 매개변수가 성공적으로 달성될 때까지 유지됩니다.
기본 요건
Android 기반 기기에서 테스트할 게임 빌드가 준비되어 있어야 합니다.
다음 도구를 설치합니다.
종합적인 게임 실적 분석
게임의 전반적인 성능을 확인하고 장면 기반 성능 저하 또는 비정상적인 부분을 식별해야 합니다. 게임을 최적화하기 전에 현재 성능을 확인하세요. 게임에는 UI와 장면이 많이 포함되므로 CPU 또는 GPU 사용량이 높은 장면이나 예상치 못한 성능을 보이는 레이아웃을 분석하여 장면별 성능 저하와 CPU 또는 GPU 사용률을 모니터링하세요.
- 성능 저하 수치화: 성능 측정 도구를 사용하여 게임의 전체 성능을 측정합니다. 장면별로 성능을 측정하여 저하 또는 비정상이 있는 특정 영역을 식별합니다.
- 문제가 있는 장면 식별: 데이터를 분석하여 CPU 또는 GPU 사용량이 높은 장면이나 화면 레이아웃이 예상 성능을 내지 못하는 장면을 찾습니다.
- 트레이스 데이터 수집: 트레이스 도구를 사용하여 식별된 문제가 있는 장면의 상세 성능 데이터를 수집합니다.
CPU 또는 GPU 병목 현상 식별
게임이 목표 FPS에 도달하지 못하면 CPU 바운드인지 GPU 바운드인지 확인합니다. 게임 플레이 중에 기기가 뜨거워지거나 전력을 너무 많이 사용하는 경우에도 CPU 및 GPU 동작을 분석하는 것은 최적화 기회를 찾는 데 매우 중요합니다. 다양한 방법을 사용하여 시스템이 CPU 바운드인지 GPU 바운드인지 확인할 수 있습니다.
추적 데이터 분석: 원하는 도구를 사용하여 추적 데이터를 분석합니다.
- Unreal Insight (Unreal Engine): 트레이스를 분석하여
GameThread,RenderThread,RHIThread의 타이밍을 확인합니다.GameThread또는RenderThread이 프레임 시간 제한 (예: 30FPS의 경우 33.3ms)을 초과하면 게임이 CPU에 종속됩니다.RHIThread가 실행 시간이 길거나 프레임 시간의 대부분을 차지하는 경우 게임이 GPU에 종속됩니다.
그림 2. GameThread, RenderThread, RHIThread가 포함된 Unreal 통계 트레이스 (확대하려면 클릭) - Unity Profiler (Unity): 렌더링 스레드에
Gfx.PresentFrame또는<GraphicsAPIName>.WaitForLastPresent이 표시되는 동안 기본 스레드가Gfx.WaitForPresentOnGfxThread와 같은 마커에서 상당한 시간을 소비하면 게임이 GPU에 바인딩됩니다.
그림 3. Unity 프로파일러의 GPU 바운드 예시(확대하려면 클릭) - Perfetto: CPU 코어 할당 및 스레드 실행 세부정보를 분석합니다. 이 분석을 통해 스레드 실행 정보를 자세히 검토하여 성능 병목 현상을 식별할 수 있습니다.
CPU 오버헤드: 트레이스에 따르면
GameThread및RenderThread의 워크로드가 VSync와 함께 RHI 스레드의QueuePresent지연을 담당하므로 CPU 바운드 시나리오를 나타냅니다.
그림 4. CPU 실행 세부정보가 포함된 Perfetto 트레이스 (확대하려면 클릭) GPU 오버헤드: GPU 완료 시간이 프레임 시간 제한(예: 25ms)을 초과하면 게임이 GPU 바운드됩니다. 트레이스에 GPU 완료가 25ms를 초과하는 것으로 표시되어 GPU 바운드 시나리오임을 나타냅니다.
그림 5. GPU 오버헤드 세부정보가 포함된 Perfetto 트레이스 (확대하려면 클릭)
- Unreal Insight (Unreal Engine): 트레이스를 분석하여
Unreal Engine 통계 명령어 사용:
stat unit: 게임, 그리기, RHI 스레드에 할당된 시간을 비교합니다. 게임 및 그리기 시간이 짧은데 RHI 시간이 프레임 시간 제한을 지속적으로 초과하면 게임이 GPU에 바인딩된 것입니다. 예를 들어 필요한 FPS가 30 (프레임당 33.33ms에 해당)이고 게임 및 그리기 스레드가 모두 10~15ms 범위 내에 일관되게 유지되지만 RHI가 일관되게 30ms를 초과하는 경우 GPU 바운드 시나리오일 가능성이 높습니다.
그림 6. 통계 단위는 GPU 바운드 조건의 추정을 용이하게 합니다. stat VulkanRHI: 대기열 제출 및 대기열 표시 기간을 확인합니다.
그림 7. Stat VulkanRHI는 GPU 바운드 조건의 추정을 용이하게 합니다 (확대하려면 클릭). stat slow: 게임, 렌더링, RHI 스레드에 할당된 시간을 자세히 살펴 장애물을 파악합니다.
실적 측정항목 확인: 종합적인 게임 실적 분석의 결과를 사용합니다. Android의 경우
- CPU 바운드: CPU (정규화됨) 사용량이 15%를 초과하고 GPU 사용량과 FPS가 낮습니다.
- GPU 바운드: GPU 사용량이 90%보다 큽니다.
일반적으로 FPS와 GPU 사용량이 낮은데 CPU 사용량이 15%를 초과하면 CPU 바운드로 간주할 수 있습니다.
그림 8. CPU 및 GPU 사용량이 포함된 성능 측정항목
CPU 성능 최적화
분석 결과 게임이 CPU에 종속된 것으로 나타나면 병목 현상을 일으키는 특정 스레드나 API를 파악하기 위해 추가로 조사합니다.
자세한 안내는 Android CPU, GPU 최적화 팁을 참고하세요.
GPU 성능 최적화
분석 결과 게임이 GPU에 종속된 것으로 나타나면 프레임 디버거를 사용하여 렌더링 파이프라인과 그리기 호출을 분석하여 자세히 조사합니다.
자세한 안내는 Android CPU, GPU 최적화 팁을 참고하세요.
최적화 효과 확인
- A/B 테스트 실행: 구현된 최적화로 빌드를 만듭니다.
- 성능 측정: 초기 분석에서 사용한 것과 동일한 도구와 방법을 사용하여 최적화된 빌드의 성능을 측정합니다.
- 결과 비교: 새 성능 데이터를 초기 데이터와 비교하여 식별된 병목 현상이 해결되었는지, FPS 및 열 타겟이 충족되었는지 확인합니다.
- 반복: 성능이 달성될 때까지 분석 및 최적화 단계를 반복합니다.