이 가이드에서는 Android 동적 성능 프레임워크(ADPF)를 사용하여 Android에서의 동적 열, CPU 및 GPU 관리 기능에 따라 게임을 최적화하는 방법을 보여줍니다. 이 프레임워크는 게임에 초점이 맞춰져 있지만, 성능이 중요한 다른 앱에도 이 기능을 사용할 수 있습니다.
ADPF는 API 집합으로, 게임 및 성능 집약적인 앱이 이 API를 사용하여 Android 기기의 전력 시스템 및 열 관련 시스템과 더 직접적으로 상호작용할 수 있습니다. 이러한 API를 사용하면 Android 시스템의 동적인 동작을 모니터링하고 기기가 과열되지 않는 지속 가능한 수준에서 게임 성능을 최적화할 수 있습니다.
모바일 SoC 및 Android에는 데스크톱 및 콘솔보다 동적인 성능 관련 동작이 더 많습니다. 이러한 동작에는 열 상태 관리, 다양한 CPU와 GPU 클록, 다양한 CPU 코어 유형이 포함됩니다. SoC의 코어 토폴로지가 점점 다양해지는 상황에서, 게임이 기기 성능에 부정적인 영향을 미치지 않도록 하면서 이 동작을 사용하려고 하면 문제가 발생합니다. ADPF는 성능의 예측 가능성을 높이기 위해 이 정보 중 일부를 제공합니다.
ADPF의 주요 기능은 다음과 같습니다.
열 상태 모니터링: 기기의 열 상태를 모니터링하여 지속할 수 없는 상태가 되기 전에 미리 성능을 조정합니다.
CPU 성능 힌트: Android에서 CPU 클록과 코어 유형 선택 시 이전 워크로드를 기준으로 하지 않고 올바르게 선택할 수 있게 해주는 성능 힌트를 제공합니다.
고정 성능 모드: 벤치마킹 중에 기기에서 고정 성능 모드를 사용 설정하여 동적 CPU 클록에 의해 변경되지 않는 측정값을 가져옵니다.
열 상태 모니터링
출시일: Android 11(API 수준 30)
모든 기기에 필수: Android 13(API 수준 33) 이상
앱은 기기의 열 상태에 따라 잠재적으로 성능이 제한되며, 기기의 열 상태는 날씨, 최근 사용량, 기기의 열 관련 설계와 같은 특성에 따라 달라질 수 있습니다. 기기는 온도로 인해 성능이 제한되기 전에 제한된 시간 동안만 높은 수준의 성능을 유지할 수 있습니다. 구현의 주요 목표는 열 제한을 초과하지 않고 성능 목표를 달성하는 것입니다. 또한, 성능 문제를 디버그할 때는 기기의 열 상태가 성능을 제한하는 시점을 파악하는 것이 중요합니다.
게임 엔진에는 일반적으로 엔진이 기기에 부여하는 워크로드를 조정할 수 있는 런타임 성능 매개변수가 있습니다. 예를 들어, 이러한 매개변수는 작업자 스레드 수, 큰 코어와 작은 코어의 작업자 스레드 어피니티, GPU 충실도 옵션, 프레임 버퍼 해상도를 설정할 수 있습니다.
기기가 안전하지 않은 열 상태에 도달하면 게임은 이러한 매개변수를 통해 워크로드를 줄여 성능이 제한되는 상황을 피할 수 있습니다. 제한 상황을 피하려면 기기의 열 상태를 모니터링하고 게임 엔진 워크로드를 미리 조정해야 합니다. 기기가 일단 과열되면 열을 방출하기 위해 워크로드가 지속 가능한 성능 수준 아래로 떨어져야 합니다.
PowerManager
ADPF는 기기의 열 상태를 모니터링하는 PowerManager
클래스를 제공합니다. 기본 요소는 다음과 같습니다.
기기가 열 제한 상태에 있지 않은 경우:
일부 제한이 있지만 성능에 큰 영향은 없는 경우:
성능에 영향을 미치는 심각한 제한이 있는 경우:
Thermal API(NDK)의 네이티브 바인딩:
getThermalHeadroom
메서드를 폴링하여 기기의 열 상태를 모니터링할 수 있습니다. 이 메서드는 기기가 과열되지 않고 얼마나 오랫동안 현재 성능 수준을 유지할 수 있는지를 결정합니다. 시간이 워크로드를 실행하는 데 필요한 시간보다 적으면 게임에서 지속 가능한 수준으로 워크로드를 줄여야 합니다. 예를 들어 게임은 더 작은 코어로 전환하거나 프레임 속도를 낮추거나 충실도를 낮출 수 있습니다.
CPU 성능 힌트
출시일: Android 12(API 수준 31)
모든 기기에 필수: 아직 필수는 아님
CPU 성능 힌트를 사용하면 기기 과열이나 전력 낭비 없이 게임이 동적 CPU 성능 동작에 영향을 줄 수 있습니다. 대부분의 기기에서 Android는 이전 요구사항에 따라 CPU 클록 속도와 워크로드의 코어 유형을 동적으로 조정합니다. 워크로드가 더 많은 CPU 리소스를 사용하면 클록 속도가 빨라지고 결국 워크로드는 더 큰 코어로 이동합니다. 워크로드에서 더 적은 리소스를 사용하면 Android는 리소스 할당을 줄입니다.
클록 속도
Android 기기에서 CPU 클록 속도를 동적으로 조정하면 주파수가 코드의 성능에 영향을 미칠 수 있습니다. 동적 클록 속도를 처리하는 코드를 설계하는 것은 성능을 극대화하고 열 상태를 안전하게 유지하며 전력을 효율적으로 사용하는 데 중요합니다. 게임을 최대 클록 속도로 실행하면 일시적으로 버벅거림을 줄이고 반응성을 높일 수 있지만, 이로 인해 전력이 소모되고 결국 클록 온도를 제한하게 됩니다. CPU 또는 GPU 클록이 제한되면 성능이 지속 가능한 수준 아래로 떨어집니다.
앱 코드에서 CPU 주파수를 직접 할당할 수 없습니다. 따라서, 앱이 더 높은 CPU 클록 속도에서 실행되도록 하는 일반적인 방법은 백그라운드 스레드에 비지 루프를 실행하여 워크로드가 더 많이 필요한 것처럼 보이는 것입니다. 그러나, 이러한 방식은 앱이 추가 리소스를 사용하지 않을 때 기기의 전력이 낭비되고 열 부하가 증가합니다.
코어 유형
게임이 실행되는 CPU 코어 유형은 또 다른 중요한 성능 요소입니다. Android 기기는 최근 워크로드 동작에 따라 스레드에 동적으로 할당된 CPU 코어를 변경하기도 합니다. CPU 코어 할당은 여러 코어 유형을 사용하는 SoC에서 훨씬 더 복잡합니다. 이러한 기기 중 일부에서는 더 큰 코어를 온도로 인해 지속할 수 없는 상태로 전환하지 않고 잠시 동안만 사용할 수 있습니다.
게임에서 CPU 코어 어피니티를 설정하려고 하면 안 되는 이유는 다음과 같습니다.
워크로드에 가장 적합한 코어 유형은 기기 모델에 따라 다릅니다.
더 큰 코어를 실행하는 지속 가능성은 SoC 및 각 기기 모델에서 제공하는 다양한 열 솔루션에 따라 다릅니다.
이러한 열 상태에 미치는 환경적 영향은 코어 선택을 더 복잡하게 할 수 있습니다. 예를 들어 날씨나 휴대전화 케이스로 인해 기기의 열 상태가 바뀔 수 있습니다.
코어 선택은 추가 성능 및 열 기능을 갖춘 새 기기를 수용할 수 없습니다. 따라서 기기는 게임의 프로세서 어피니티를 무시하는 경우가 많습니다.
PeformanceHintManager
ADPF는 PerformanceHintManager
클래스를 제공하므로 게임에서 CPU 클록 속도와 코어 유형의 성능 힌트를 Android에 제공할 수 있습니다. 그런 다음, OS는 SoC 및 기기 열 솔루션을 기반으로 힌트를 가장 잘 사용할 수 있는 방법을 결정할 수 있습니다. 앱이 이 API와 함께 열 상태 모니터링을 사용하는 경우 제한이 발생할 수 있는 비지 루프와 그 외 다른 코딩 기법을 사용하는 대신 OS에 더 많은 정보가 담긴 힌트를 제공할 수 있습니다.
게임에서 성능 힌트를 사용하는 방법은 다음과 같습니다.
힌트 세션 만들기: 유사한 방식으로 작동하는 키 스레드를 위해 힌트 세션을 만듭니다. 예를 들면 다음과 같습니다.
- 렌더링 스레드가 한 세션을 받음
- IO 스레드가 다른 세션을 받음
- 오디오 스레드가 세 번째 세션을 받음
게임은 이 작업을 초기에 해야 합니다. 세션에서 시스템 리소스를 더 많이 필요로 하는 시점으로부터 최소 2ms(4ms를 넘는 것이 권장됨) 전에 해야 합니다.
각 힌트 세션에서 각 세션을 실행하는 데 필요한 시간을 예측합니다. 일반적인 시간은 프레임 간격과 같지만 워크로드가 프레임 간에 크게 달라지지 않는 경우 앱에서 더 짧은 간격을 사용할 수 있습니다.
고정 성능 모드
출시일: Android 11(API 수준 30)
모든 기기에 필수: 아직 필수는 아님
Android 기기는 시스템 부하에 따라 동적으로 클록을 변경할 수 있습니다. 이 동작은 사용 중에 전력을 절약하는 데는 유용하지만, 안정적인 성능 데이터를 얻기는 어려울 수 있습니다. 회귀 방지를 위해 코드 프래그먼트를 실행할 수 있는 속도를 확인하려고 하거나 최적화가 반복 가능한 경우에는 고정 클록 속도로 테스트되지 않으면 결과를 신뢰할 수 없습니다. 고정 클록을 사용하면 하나의 요소가 되는 CPU 주파수를 변경하지 않고 성능에 관해 정확한 A/B 테스트를 실행할 수 있습니다.
고정 성능 모드는 상한과 하한이 있는 CPU 클록과 GPU 클록을 설정합니다. 이 모드는 코어 선택과 같은 다른 동적 성능 동작을 중지하지 않습니다.
다음 adb 명령어를 사용하여 고정 성능 모드를 사용 설정할 수 있습니다.
adb shell cmd power set-fixed-performance-mode-enabled [true|false]
고정 성능 모드로 실행 중인 기기는 이러한 모드가 기기를 지속 가능한 발열 상태에 두지 않으므로 계속 과열될 수 있습니다. 이런 이유로 벤치마크 실행에는 다음이 권장됩니다.
실행 시작 전, 기기가 발열 상태와 관련하여 지속 가능한 상태를 반환하도록 대기합니다.
테스트하는 동안 기기의 열 상태를 모니터링하여 벤치마크 코드와 열 이벤트 간의 영향을 구분합니다.
샘플 앱
ADPF 샘플 앱은 ADPF API의 기본 사용법을 보여줍니다. 샘플은 ADPF getThermalHeadroom
API 및 열 상태 API를 사용하여 기기의 열 상태를 표시합니다. 또한 앱은 API의 힌트와 PerformanceHintManager
API를 기반으로 워크로드를 동적으로 변경하여 렌더링 스레드 성능을 제어합니다.