Gestire la potenza e le prestazioni dei dispositivi Android può contribuire a garantire che le app vengano eseguite in modo coerente e fluido su un'ampia gamma di hardware. In Android 7.0 e versioni successive, gli OEM possono implementare il supporto per suggerimenti sulle prestazioni prolungati che consentono alle app di mantenere prestazioni costanti del dispositivo e specificare un core esclusivo per migliorare le prestazioni delle app in primo piano ad uso intensivo della CPU.
Prestazioni sostenute
Per le app di lunga durata (giochi, fotocamera, RenderScript , elaborazione audio), le prestazioni possono variare notevolmente quando vengono raggiunti i limiti di temperatura del dispositivo e i motori System on Chip (SoC) vengono limitati. Gli sviluppatori di app che creano app ad alte prestazioni e di lunga durata sono limitati perché le funzionalità della piattaforma sottostante sono un bersaglio mobile quando il dispositivo inizia a surriscaldarsi.
Per risolvere queste limitazioni, Android 7.0 ha introdotto il supporto per prestazioni sostenute, consentendo agli OEM di fornire suggerimenti sulle capacità prestazionali del dispositivo per app a lunga esecuzione. Gli sviluppatori di app possono utilizzare questi suggerimenti per ottimizzare le app per un livello prevedibile e coerente di prestazioni del dispositivo per lunghi periodi di tempo.
Architettura
Un'app Android può richiedere alla piattaforma di entrare in una modalità di prestazioni sostenute in cui il dispositivo Android può mantenere un livello costante di prestazioni per periodi di tempo prolungati.
Implementazione
Per supportare prestazioni sostenute in Android 7.0 e versioni successive, gli OEM devono:
- Apporta modifiche specifiche del dispositivo all'HAL di potenza per bloccare le frequenze massime di CPU/GPU o eseguire altre ottimizzazioni per prevenire la limitazione termica.
- Implementa il nuovo suggerimento
POWER_HINT_SUSTAINED_PERFORMANCE
nel power HAL. - Dichiara il supporto restituendo TRUE tramite l'API
isSustainedPerformanceModeSupported()
. - Implementare
Window.setSustainedPerformanceMode
.
Nell'implementazione di riferimento del Nexus, il suggerimento di potenza limita le frequenze massime di CPU e GPU ai livelli più alti sostenibili. Tieni presente che abbassando la barra MAX della frequenza CPU/GPU si abbasserà il frame rate, ma questo tasso più basso è preferibile in questa modalità per via della sua sostenibilità. Ad esempio, un dispositivo che utilizza i normali clock massimi potrebbe essere in grado di eseguire il rendering a 60 FPS per alcuni minuti, ma dopo che il dispositivo si è riscaldato, potrebbe rallentare a 30 FPS entro la fine dei 30 minuti. Quando si utilizza la modalità sostenuta, il dispositivo può, ad esempio, eseguire il rendering costantemente a 45 FPS per tutti i 30 minuti. L'obiettivo è un frame rate quando si utilizza la modalità che sia altrettanto alto (o superiore) rispetto al frame rate quando non si utilizza la modalità e coerente nel tempo in modo che gli sviluppatori non debbano inseguire un bersaglio in movimento.
Consigliamo vivamente di implementare la modalità sostenuta in modo che il dispositivo raggiunga le massime prestazioni sostenute possibili, non solo i valori minimi richiesti per superare il test (ad esempio, scegliere i limiti di frequenza MAX più alti possibili che non causino limitazioni termiche del dispositivo nel tempo).
Nota : per implementare la modalità sostenuta non è necessario limitare le frequenze di clock MAX.
Validazione
Gli OEM possono utilizzare un test CTS (Android 7.0 e versioni successive) per verificare l'implementazione dell'API a prestazioni sostenute. Il test esegue un carico di lavoro per circa 30 minuti e confronta le prestazioni con e senza la modalità sostenuta abilitata:
- Con la modalità sostenuta abilitata, la frequenza fotogrammi deve rimanere relativamente costante (il test misura la percentuale di variazione della frequenza fotogrammi nel tempo e richiede una variazione <5%).
- Con la modalità sostenuta abilitata, il frame rate non deve essere inferiore al frame rate alla fine dei 30 minuti con la modalità disabilitata.
Inoltre, puoi testare manualmente la tua implementazione con diversi carichi di lavoro ad uso intensivo di CPU e GPU per garantire che il dispositivo non subisca limitazioni termiche dopo 30 minuti di utilizzo. Nei test interni, abbiamo utilizzato carichi di lavoro campione inclusi giochi e app di benchmarking (ad esempio gfxbench ).
Nuclei esclusivi
Per i carichi di lavoro ad uso intensivo della CPU e sensibili al tempo, essere anticipati da un altro thread può fare la differenza tra rispettare o meno le scadenze dei frame. Per le app che hanno requisiti rigorosi di latenza e frame rate (come app audio o di realtà virtuale), avere un core CPU esclusivo può garantire un livello di prestazioni accettabile.
I dispositivi con Android 7.0 o versioni successive ora possono riservare esplicitamente un core per l'app in primo piano, migliorando le prestazioni di tutte le app in primo piano e offrendo alle app con carichi di lavoro ad alta intensità un maggiore controllo su come il loro lavoro viene allocato tra i core della CPU.
Per supportare un core esclusivo su un dispositivo:
- Abilita
cpusets
e configura uncpuset
che contenga solo l'app in primo piano in primo piano. - Assicurati che un core (questo è il core esclusivo) sia riservato ai thread di questo
cpuset
. - Implementa l'API getExclusiveCores per restituire il numero del core esclusivo.
Per determinare quali processi sono pianificati su quali core, utilizza systrace
durante l'esecuzione di qualsiasi carico di lavoro e verifica che nessun thread dello spazio utente da app diverse dall'app in primo piano sia pianificato sul core esclusivo.
Per visualizzare un'implementazione di riferimento per il Nexus 6P, fare riferimento a android//device/huawei/angler/power/power.c
.