Android 기기의 전력과 성능을 관리하면 광범위한 하드웨어에서 앱이 원활하고 일관성 있게 실행되도록 하는 데 도움이 됩니다. Android 7.0 이상에서는 OEM이 지속적인 성능 힌트에 관한 지원을 구현할 수 있습니다. 이러한 힌트는 앱이 일관적인 기기 성능을 유지하고 전용 코어를 지정하여 CPU를 많이 사용하는 포그라운드 앱의 성능을 개선해 줍니다.
지속적인 성능
오랫동안 실행되는 앱(게임, 카메라, RenderScript, 오디오 처리)의 경우 기기 온도 제한에 도달하고 SoC(단일 칩 시스템) 엔진이 제한되면서 성능이 극적으로 변화할 수 있습니다. 오랫동안 실행되는 고성능 앱을 개발 중인 앱 개발자는 제한되어 있습니다. 기기 온도가 상승하기 시작하면 기본 플랫폼의 기능이 움직이는 과녁과도 같기 때문입니다.
이러한 제한을 극복하기 위해 Android 7.0에는 지속적인 성능에 관한 지원이 도입되었으며, 이를 통해 OEM은 오랫동안 실행되는 앱의 기기 성능 기능에 관한 힌트를 제공할 수 있습니다. 앱 개발자는 이들 힌트를 사용하여 장기간에 걸쳐 기기 성능을 예측 가능하고 이 성능을 일관된 수준으로 유지하기 위해 앱을 적절히 조정할 수 있습니다.
아키텍처
Android 앱은 Android 기기가 오랜 시간 동안 일관적인 수준의 성능을 유지할 수 있는 지속적인 성능 모드에 돌입하도록 플랫폼에 요청할 수 있습니다.
구현
Android 7.0 이상에서 지속적인 성능을 지원하려면 OEM이 다음을 충족해야 합니다.
- 전력 HAL에 기기 관련 변경사항을 적용하여 최대 CPU/GPU 주파수를 잠급니다. 또는 다른 최적화를 실행하여 온도로 인한 성능 제한을 예방합니다.
- 전력 HAL에 새로운 힌트
POWER_HINT_SUSTAINED_PERFORMANCE
를 구현합니다. isSustainedPerformanceModeSupported()
API를 통해 TRUE를 반환하여 지원을 선언합니다.Window.setSustainedPerformanceMode
를 구현합니다.
Nexus 참조 구현에서는 전력 힌트가 CPU 및 GPU의 최대 주파수를 지속 가능한 가장 높은 수준으로 제한합니다. CPU/GPU 주파수의 최대치를 낮추면 프레임 속도가 감소하지만 이 모드에서는 지속가능성으로 인해 낮은 속도가 선호된다는 점을 기억해야 합니다. 예를 들어 일반적인 최대 클록을 사용하는 기기는 몇 분 동안 60FPS에서 렌더링 가능할 수 있지만 기기 온도가 상승한 후에는 30분이 지났을 때 30FPS로 제한될 수 있습니다. 지속 모드를 사용 중인 경우에는 예를 들어 기기가 30분 내내 45FPS에서 일관적으로 렌더링할 수 있습니다. 목표는 지속 모드를 사용할 때의 프레임 속도가 지속 모드를 사용하지 않을 때의 프레임 속도와 같거나 그보다 높은 것이며, 개발자가 움직이는 과녁을 쫓을 필요가 없도록 일관적인 속도를 유지하는 것입니다.
기기가 테스트에 합격하는 데 필요한 최솟값이 아니라 가능한 가장 높은 지속 성능을 달성할 수 있도록 지속 모드를 구현하는 것이 좋습니다(예: 기기가 시간 경과에 따라 온도로 인한 성능 제한을 야기하지 않도록 가능한 가장 높은 최대 주파수 한도를 선택).
참고: 지속 모드 구현을 위해 최대 클록 속도를 제한할 필요는 없습니다.
유효성 검사
OEM은 CTS 테스트(Android 7.0 이상)를 사용하여 지속적인 성능 API의 구현을 검증할 수 있습니다. 테스트는 약 30분 동안 워크로드를 실행하고, 지속 모드를 사용하여 측정한 성능과 지속 모드를 사용하지 않고 측정한 성능을 벤치마킹합니다.
- 지속 모드가 사용 설정된 경우 프레임 속도가 비교적 일정한 수준을 유지해야 합니다(테스트는 시간 경과에 따른 프레임 속도의 백분율 변화를 측정하며 변화는 5% 미만이어야 함).
- 지속 모드가 사용 설정된 경우 프레임 속도가 모드를 사용 중지한 상태로 30분이 지났을 때의 프레임 속도보다 낮으면 안 됩니다.
또한 CPU와 GPU를 많이 사용하는 여러 워크로드로 구현을 직접 테스트하여 기기를 사용한 지 30분 후부터 기기가 온도로 인해 성능을 제한하지 않는지 확인해야 합니다. Google은 내부 테스트에서 게임 및 벤치마킹 앱(예: gfxbench)을 포함한 워크로드 표본을 사용합니다.
전용 코어
CPU를 많이 사용하고 시간에 민감한 워크로드는 다른 스레드에 의해 선점되느냐에 따라 프레임 기한 충족 여부가 좌우될 수 있습니다. 지연 시간과 프레임 속도 요구사항이 엄격한 앱(오디오 또는 가상 현실 앱)의 경우에는 전용 CPU 코어의 보유로 허용 가능한 성능 수준을 보장할 수 있습니다.
Android 7.0 이상을 실행하는 기기는 이제 1개의 코어를 상단 포그라운드 앱 전용으로 예약하여 모든 포그라운드 앱의 성능을 개선하고 강도 높은 워크로드를 포함하는 앱이 작업을 여러 CPU 코어에 걸쳐 할당하는 방식을 좀 더 효율적으로 관리할 수 있도록 지원할 수 있습니다.
기기에 전용 코어를 지원하는 방법은 다음과 같습니다.
cpusets
를 사용 설정하고 상단 포그라운드 앱만 포함된cpuset
를 구성합니다.- 이
cpuset
의 스레드에 한 개의 전용 코어가 예약되어 있는지 확인합니다. - getExclusiveCores API를 구현하여 전용 코어의 코어 수를 반환합니다.
어떤 프로세스가 어떤 코어에 예약되어 있는지 파악하려면 워크로드 실행 도중 systrace
를 사용하여 상단 포그라운드 앱을 제외한 나머지 앱의 사용자 공간 스레드가 전용 코어에 예약되어 있지 않은지 확인합니다.
Nexus 6P의 참조 구현을 확인하려면 android//device/huawei/angler/power/power.c
를 참고하세요.